c#Nhibernate会话不更新

时间:2011-02-11 06:08:31

标签: c# nhibernate session

我注意到我的应用程序中使用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>();
        }

2 个答案:

答案 0 :(得分:0)

你做错了。当您正在检索Transaction个对象时,您应该在此NH Session内进行更改。而不是使用在using块之后处置的会话,然后您正在创建新的会话。如果您在从某些Session获取对象后需要解耦某些逻辑,那么您应该通过Session而不是创建新的逻辑。因此,您的工作流程应如下所示:

  1. 打开会话并检索Transaction对象
  2. 对对象进行CRUD操作(使用NHibernate事务)
  3. 提交或回滚交易
  4. 关闭会话

答案 1 :(得分:0)

从交易到车辆的关系是多对一而不是一对一的关系。你如何映射这个?

我同意这个(dbHelper)不适合使用NHibernate。