我读了大约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");
中SessionFactory
在SchemaExport(cfg).Execute(true, true, false, session.Connection, Console.Out);
SessionFactory
但没有任何改变
我错过了什么?
答案 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();
并且工作得更多
当我有时间时,我会打开一些关于更多错误的新问题