nhibernate use_identifier_rollback all-delete-orphan

时间:2013-08-30 10:11:46

标签: c# nhibernate entity identity rollback

在NH中是一个配置设置'use_identifier_rollback',它将实体的id设置回其默认值。

此设置适用于除“delete-orphan”之外的每个级联选项。 (而且我知道为什么!)

查看C# Identifier Rollback

查看Java Identifier Rollback

// Works with 'use_identifier_rollback' and 'cascade-option=all' 
// but not with 'cascade-option=all-delete-orphan'
Sample sample = new Sample("sample");
sample.Add(new Subsample("subsample");
int sampleId;
using(var session = sessionFactoy.OpenSession())
{
  using(var tx = session.BeginTransaction())
  {
       session.Save(sample);
       sampleId = sample.Id;
       Assert.That(sampleId, Is.GreaterThan(0));
       Assert.False(sample.IsTransient)
  } // Rollback
}
Assert.That(sample.Id, Is.EqualTo(0));
Assert.True(sample.IsTransient)

在回滚保存时还原id是不好的做法? 在java代码中没有注释掉并且有效。

更新 删除实体时,您通常会期望什么行为?

// Works with 'use_identifier_rollback' and 'cascade-option=all' 
// but not with 'cascade-option=all-delete-orphan'
int sampleId; // sampleId from above
using(var session = sessionFactoy.OpenSession())
{
  using(var tx = session.BeginTransaction())
  {
       Sample sample = session.Get<Sample>(sampleId);
       Assert.That(sampleId, Is.GreaterThan(0));
       Assert.False(sample.IsTransient)
       session.Delete(sample);
       tx.Commit();
  }
}
Assert.That(sample.Id, Is.EqualTo(0));
Assert.True(sample.IsTransient)

使用'use_identifier_rollback'nhibernate将id设置为'0'或更准确地设置为标识的默认值。我的IsTransient属性取决于Id == 0

  • 在实体被删除时如何处理实体,如果是实体瞬态或被删除实体的ID是什么,......?

1 个答案:

答案 0 :(得分:0)

看起来它还没有在NHibernate中实现。请参阅NHibernate的问题跟踪器:NH-387。如果对您来说重要,请登录并投票。您甚至可以通过GitHub提供单元测试和修复。看起来有人已经在这个问题上做了一些工作 - 这个问题附有几个补丁文件,但我不知道他们处于什么状态。