Integrating NHibernate with MySql
本文关键字:MySql with NHibernate Integrating | 更新日期: 2023-09-27 18:10:26
这几天我一直在尝试连接NHibernate和MySQL。我正在使用存储库模式,它可以很好地从数据库中获取数据。然而,我不能保存数据。代码没有返回错误,但是数据没有插入到数据库中。这一切看起来都很简单,而且它确实返回数据。我只是不知道如何调试的事实,它没有返回任何错误,当我执行Nhibernate SaveOrUpdate方法,但不保存任何东西。
这是使用Repository保存Person对象的代码;
[Test]
public void Given_New_User_When_Saved_User_Can_Be_Detected()
{
Person testPerson = new Person("George", "Candle");
IRepository repository = new RepositoryBase();
repository.Save(testPerson);
List<Person> personList = repository.ToList<Person>();
Assert.IsTrue(personList.Exists(x => x.FirstName == "George"));
}
下面是RepositoryBase代码:
公共类RepositoryBase: IRepository, IDisposable
{
protected ISession _session = null;
protected ITransaction _transaction = null;
public RepositoryBase()
{
_session = Database.OpenSession();
}
public RepositoryBase(ISession session)
{
_session = session;
}
//Transaction and Session Management Methods
public void BeginTransaction()
{
_transaction = _session.BeginTransaction();
}
public void CommitTransaction()
{
_transaction.Commit();
CloseTransaction();
}
public void RollbackTransaction()
{
_transaction.Rollback();
CloseTransaction();
CloseSession();
}
private void CloseSession()
{
_session.Close();
_session.Dispose();
_session.Flush();
_session = null;
}
private void CloseTransaction()
{
_transaction.Dispose();
_transaction = null;
}
//IRepository members
public virtual void Save(object obj)
{
_session.SaveOrUpdate(obj);
}
}
这是数据库类
公共静态类数据库{私有静态ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
string connString = "server=172.16.20.38;Port=3306;userid=root;database=KanbanDevelopment;password=;Persist Security Info=True;";
_sessionFactory = Fluently.Configure()
.Database(MySQLConfiguration.Standard
.ConnectionString(connString))
// .ExposeConfiguration(cfg => new SchemaExport(cfg).Execute(true, true, false))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>())
.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
这是一个简单的改变。我需要使用_session.Save(obj)而不是_session.SaveOrUpdate(obj)。这解决了我的问题,但我不知道为什么SaveOrUpdate不工作。摆弄我的代码,我能够生成一个"NHibernate"。StaleObjectStateException:行被另一个事务更新或删除(或未保存值映射不正确)"。关于StackOverflow的一个建议是使用_session。保存,这两个问题都解决了。