NHibernate SchemaExport(config).Create(false,true)不会使用SQL Server 2014 LocalDB创建数据库架构

时间:2014-08-04 09:18:06

标签: c# nhibernate localdb

我读了大约20个关于这个问题的问题,但找不到我的具体案例的解决方案,所以我在这里......

我使用通过NuGet

安装的nhibernate和流畅的nhibernate的最新版本

所有课程都是公开的,我在构建时没有错误。

这是我的sessionFactory

public class SessionFactory : IDisposable
{
     private static ISessionFactory _sessionFactory;
     private static Configuration cfg = new NHibernate.Cfg.Configuration();

        private static void InitializeSessionFactory(bool ricreaDatabase = false)
        {
            cfg.Configure(); // read config default style

            var mappings = AutoMap.AssemblyOf<ClasseTest>(new AutoMapConfiguration());
            mappings.WriteMappingsTo(@"c:\mappings");

            Fluently.Configure(cfg)
                .Mappings(m => m.AutoMappings.Add(mappings))
                .ExposeConfiguration(config => new SchemaExport(config).Create(false, true));       
            _sessionFactory = cfg.BuildSessionFactory();
        }

        internal ISession OpenSession()
        {
            NHibernate.ISession session = _sessionFactory.OpenSession();
            return session;
        }

        public SessionFactory()
        {
            InitializeSessionFactory();
        }
}

和我的UnitOfWork

public class UnitOfWork : IUnitOfWork
{
    private ITransaction _transaction;
    private SessionFactory _nhHelper;
    private ISession _session;

    public UnitOfWork()
    {
        _nhHelper = new SessionFactory();
        if (_session == null)
        { _session = _nhHelper.OpenSession(); }
    }

    public void Begin()
    {
        InizializzaSessione();
        _transaction = _session.BeginTransaction();
        Contract.Ensures(_session.Transaction.IsActive);
    }

    public void Save()
    {
        if (_transaction != null)
        {
            _transaction.Commit();
            _transaction = null;
        }
    }
}

在测试项目中,我有hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">Server=(LocalDB)\v11.0; Integrated Security=true;AttachDbFilename=C:\Mauro\Sviluppo\Gedi\Test\Gedi.IntegrationTest.DataAccess\DbTest.mdf;</property>
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    <property name="show_sql">true</property> 

  </session-factory>
</hibernate-configuration>

和测试方法

public void canCreateClasseTest()
    {

        using (IUnitOfWork uow = new UnitOfWork())
        {
            uow.Begin();
            uow.ServiceRepositoryFor<ClasseTest>().Create(fixture.Create<ClasseTest>());
            uow.Save();
        }
    }

ClasseTest是我为此示例创建的简单类,我强制AutoMapConfiguration仅映射它

但是在调用Begin之后我在数据库中看不到任何表,所以当存储库调用_session.SaveOrUpdate(obj)时,我得到“no persister for”错误

我查看生成的地图,这是代码:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class xmlns="urn:nhibernate-mapping-2.2" name="Gedi.Domain.Object.Entity.ClasseTest, Gedi.Domain.Object, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`ClasseTest`">
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="identity" />
    </id>
    <property name="Desc" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Desc" />
    </property>
  </class>
</hibernate-mapping>

我试过

    配置文件中的
  • <property name="hbm2ddl.auto">create</property>
  • cfg.SetProperty("hbm2ddl.auto", "create");
  • SessionFactorySchemaExport(cfg).Execute(true, true, false, session.Connection, Console.Out);
  • 中的OpenSession之后
  • SessionFactory

但没有任何改变

我错过了什么?

1 个答案:

答案 0 :(得分:0)

问题在于:

cfg.Configure(); // read config default style

            var mappings = AutoMap.AssemblyOf<ClasseTest>(new AutoMapConfiguration());
            mappings.WriteMappingsTo(@"c:\mappings");

            Fluently.Configure(cfg)
                .Mappings(m => m.AutoMappings.Add(mappings))
                .ExposeConfiguration(config => new SchemaExport(config).Create(false, true));       
            _sessionFactory = cfg.BuildSessionFactory();

混合的流利和xml配置根本不起作用

我将其更改为:

_sessionFactory = Fluently.Configure()
                .Mappings(m => m.AutoMappings.Add(mappings))    
                .Database(
                    MsSqlConfiguration.MsSql2012.ConnectionString("YourConnectionsStringGoesHere")
                        )//End Database
                .ExposeConfiguration(config => new SchemaExport(config).Create(false, true))
                .BuildSessionFactory();

并且工作得更多

当我有时间时,我会打开一些关于更多错误的新问题