Fluent Nhibernate在数据库中保存持久化实体两次

本文关键字:两次 实体 持久化 Nhibernate 数据库 保存 Fluent | 更新日期: 2023-09-27 18:19:03

我有一个基类ID为主键和3个版本号。

[NotNull]
public virtual int Id { get; private set; }
[NotNull]
[NotUpdatable]
public virtual int BaseVersion { get; set; }
[NotNull]
[NotUpdatable]
public virtual int MajorVersion { get; set; }
[NotNull]
[NotUpdatable]
public virtual int MinorVersion { get; set; }

现在我想再次持久化对象,如果它得到一个新的版本号,或者如果它不存在于数据库中。

foreach (var dataObject in unitOfWork.NewObjects)
{
  if (dataObject.Id > 0)
  {
     _transactionHelper.GetSession().SaveOrUpdate(dataObject.DeepClone());
     continue;
  }
  _transactionHelper.GetSession().SaveOrUpdate(dataObject);
}

我的想法是做一个深度克隆,但遗憾的是(对我来说)Nhibernate只更新现有的数据记录。我用

取得了一些成功
_transactionHelper.GetSession().Evict(dataObject);
_transactionHelper.GetSession().Save(dataObject.DeepClone());

但是Nhibernate的级联功能不能正常工作,我有时会得到这个异常分离实体传递到持久化(什么是正确的)。

一些想法?或者我必须自己编程:/

谢谢!

Fluent Nhibernate在数据库中保存持久化实体两次

我通过编写自己的映射容器来跟踪关系的状态,从而解决了这个问题。我认为主要的问题是/是我使用了我自己的复合表(我需要添加一些值,如active)。

要持久化一个已经持久化的实体,我使用:

_transactionHelper.GetSession().Evict(dataObject);
dataObject.Id = 0;
_transactionHelper.GetSession().Save(dataObject);