gpt4 book ai didi

c# Nhibernate Session 不更新

转载 作者:行者123 更新时间:2023-11-30 18:43:01 24 4
gpt4 key购买 nike

我注意到在我使用 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
}

那么这是否意味着关系属性依赖于 session ?

编辑:

我正在使用 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>();
}

最佳答案

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

  1. 打开 session 并获取Transaction对象
  2. 对对象进行 CRUD 操作(使用 NHibernate 事务)
  3. 提交或回滚事务
  4. 结束 session

关于c# Nhibernate Session 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4966109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com