【问题标题】:c# Nhibernate Session Not updatingc# Nhibernate Session 不更新
【发布时间】:2011-02-11 21:00:40
【问题描述】:

我注意到我使用 NHibernate 的应用程序出现了一个奇怪的行为

给你一些背景知识,数据库中有 2 个表:

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 中的 2 个方法

  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>();
        }

【问题讨论】:

  • 您能否向我们展示您的映射,我怀疑您的映射上没有 Cascade。
  • 我对 dbHelper 深表怀疑 - 你能告诉我们吗?另外:在一堆与数据库会话相关的进程中间有一个定制的 Transaction 类可能不是该类的最佳命名方案。

标签: c# nhibernate session


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Transaction 与 Vehicle 的关系是多对一而非一对一。你是如何映射的?

    我同意这个 (dbHelper) 不是使用 NHibernate 的好模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-16
      • 2014-10-05
      • 1970-01-01
      • 2014-03-08
      • 2010-10-03
      • 1970-01-01
      • 2012-06-05
      • 2012-05-09
      相关资源
      最近更新 更多