我注意到我的应用程序中使用NHibernate的奇怪行为
为了给你一些背景知识,数据库中有两个表:
1)交易 2)车辆
交易与车辆有一对一关联。
我有一个数据库助手类,其中包含Save和GetAll方法。
因此,当我运行以下代码时,一切都按预期工作。
Transaction t;
using (var session = sessionFactory.OpenSession())
{
t = dbHelper.GetAll<Transaction>(session)[0];
t.Vehicle.Odometer = "777";
dbHelper.Save(t, session); // This updates the vehicle table's odometer property to 777
}
但是,如果我修改我的代码如下
Transaction t;
using (var session = sessionFactory.OpenSession())
{
t = dbHelper.GetAll<Transaction>(session)[0];
}
using (var session = sessionFactory.OpenSession())
{
t.Vehicle.Odometer = "777";
dbHelper.Save(t, session); // This does not update the vehicle table.
// but
dbHelper.Save(t.Vehicle, session); // Works
}
这是否意味着关系属性与会话有关?
修改
我正在使用Fluent和AutoMapper,这是我正在使用的常规类别之一:
internal class OneToOneConvention : IHasOneConvention
{
public void Apply(IOneToOneInstance instance)
{
instance.Cascade.All();
}
}
修改
以下是dbHelper
中的两个方法 public void Save<T>(T entity, ISession session)
{
using (ITransaction transaction = session.BeginTransaction())
{
try
{
session.SaveOrUpdate(entity);
transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
throw;
}
}
}
和GetAll
public IList<T> GetAll<T>(ISession session) where T : class
{
return session.CreateCriteria<T>().List<T>();
}
答案 0 :(得分:0)
你做错了。当您正在检索Transaction
个对象时,您应该在此NH Session
内进行更改。而不是使用在using
块之后处置的会话,然后您正在创建新的会话。如果您在从某些Session
获取对象后需要解耦某些逻辑,那么您应该通过Session
而不是创建新的逻辑。因此,您的工作流程应如下所示:
Transaction
对象答案 1 :(得分:0)
从交易到车辆的关系是多对一而不是一对一的关系。你如何映射这个?
我同意这个(dbHelper)不适合使用NHibernate。