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

时间:2014-08-21 16:03:12

标签: c# c#-4.0 nhibernate fluent-nhibernate fluent-nhibernate-mapping

我有一个基类,其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级联功能无法正常工作,我有时会将这个异常的分离实体传递给persist(什么是正确的)。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

要保留我使用的allready持久化实体:

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

看起来这个解决方案对我的问题很有效。