Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да използвате NHibernate както с MySQL сървър, така и с Microsoft SQL сървър 2008

Преди няколко месеца се борих доста. Проблемът ми беше с MS Sql Server и Oracle.

Това, което направих, е да създам два отделни конфигурационни файла за nhibernate:

sql.nhibernate.config

<?xml version="1.0" encoding="utf-8"?>
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
      <reflection-optimizer use="false" />
      <session-factory name="BpSpedizioni.MsSql">
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
        <!-- <property name="connection.connection_string">Data Source=(local); Initial Catalog=NHibernate; Trusted_Connection=true;</property> -->
        <property name="current_session_context_class">web</property>
        <property name="adonet.batch_size">100</property>
        <property name="command_timeout">120</property>
        <property name="max_fetch_depth">3</property>
        <property name='prepare_sql'>true</property>
        <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
        <property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
        <mapping assembly="BpSpedizioni.Services"/>
      </session-factory>
</hibernate-configuration>

ora.nhibernate.config

<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <reflection-optimizer use="false" />
  <session-factory name="BpSpedizioni.Oracle">
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
    <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
    <!-- <property name="connection.connection_string">Data Source=(local); Initial Catalog=NHibernate; Trusted_Connection=true;</property> -->
    <property name="current_session_context_class">web</property>
    <property name="adonet.batch_size">100</property>
    <property name="command_timeout">120</property>
    <property name="max_fetch_depth">3</property>
    <property name='prepare_sql'>true</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
    <mapping assembly="BpSpedizioni.Services"/>
  </session-factory>
</hibernate-configuration>

Използвам този прост клас, за да създам моя nhibernate SessionFactory:

    public class NHibernateSessionFactory
    {
        private ISessionFactory sessionFactory;

        private readonly string ConnectionString = "";
        private readonly string nHibernateConfigFile = "";

        public NHibernateSessionFactory(String connectionString, string nHConfigFile)
        {
            this.ConnectionString = connectionString;
            this.nHibernateConfigFile = nHConfigFile;
        }

        public ISessionFactory SessionFactory
        {
            get { return sessionFactory ?? (sessionFactory = CreateSessionFactory()); }
        }

        private ISessionFactory CreateSessionFactory()
        {
            Configuration cfg;
            cfg = new Configuration().Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, this.nHibernateConfigFile));

            // With this row below Nhibernate searches for the connection string inside the App.Config.
            // cfg.SetProperty(NHibernate.Cfg.Environment.ConnectionStringName, System.Environment.MachineName);
            cfg.SetProperty(NHibernate.Cfg.Environment.ConnectionString, this.ConnectionString);

#if DEBUG
            cfg.SetProperty(NHibernate.Cfg.Environment.GenerateStatistics, "true");
            cfg.SetProperty(NHibernate.Cfg.Environment.ShowSql, "true");
#endif

            return (cfg.BuildSessionFactory());
        }
    }

Както можете да видите, предавам на моя NHibernateSessionFactory низ за връзка (предпочитам да го запиша в конфигурационния файл на приложението си) и името (без пътя) на конфигурационния файл на nhibernate.

Аз лично използвам DI контейнер (StructureMap) и можете да постигнете нещо много страхотно, определяйки клас на системния регистър:

public class NhibernateRegistry : Registry
{
    public NhibernateRegistry()
    {

        For<ISessionFactory>()
        .Singleton()
        .Add(new NHibernateSessionFactory(<oracle connection string>, "ora.nhibernate.config").SessionFactory)
        .Named("OracleSF");

        For<ISession>()
        .HybridHttpOrThreadLocalScoped()
        .Add(o => o.GetInstance<ISessionFactory>("OracleSF").OpenSession())
        .Named("OracleSession");

        For<ISessionFactory>()
        .Singleton()
        .Add(new NHibernateSessionFactory(<ms sql connection string>, "sql.nhibernate.config").SessionFactory)
        .Named("MsSqlSF");

        For<ISession>()
        .HybridHttpOrThreadLocalScoped()
        .Add(o => o.GetInstance<ISessionFactory>("MsSqlSF").OpenSession())
        .Named("MsSqlSession");
    }
}

в който можете да използвате наименувани екземпляри. Моят слой на услугите използва клас на регистъра StructureMap, където можете да дефинирате конструкторите:

this.For<IOrdersService>()
     .HybridHttpOrThreadLocalScoped()
     .Use<OrdersService>()
     .Ctor<ISession>("sessionMDII").Is(x => x.TheInstanceNamed("OracleSession"))
     .Ctor<ISession>("sessionSpedizioni").Is(x => x.TheInstanceNamed("MsSqlSession"));

За внедряване на вашата услуга:

public class OrdersService : IOrdersService
{
        private readonly ISession SessionMDII;
        private readonly ISession SessionSpedizioni;

        public OrdersService(ISession sessionMDII, ISession sessionSpedizioni)
        {
            this.SessionMDII = sessionMDII;
            this.SessionSpedizioni = sessionSpedizioni;
        }

    ...
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORD() Примери – MySQL

  2. Как да изразя a has many чрез връзка в Entity Framework 5?

  3. Параметризирани заявки PHP/MySQL

  4. Laravel Eloquent query JSON колона с Where In?

  5. Създател на заявки Laravel - Как да групирате по псевдоним или да направите необработено groupBy