C# nhibernate使用\u标识符\u回滚所有删除孤立项

C# nhibernate使用\u标识符\u回滚所有删除孤立项,c#,nhibernate,entity,identity,rollback,C#,Nhibernate,Entity,Identity,Rollback,NH中有一个配置设置“use_identifier_rollback”,它将实体的id设置回其默认值 此设置适用于除“删除孤立项”之外的所有级联选项。(我知道为什么!) 看看 看看 回滚保存时还原id是否是错误的做法? 在java代码中,注释是不正确的 更新: 删除实体时通常会出现什么行为 // Works with 'use_identifier_rollback' and 'cascade-option=all' // but not with 'cascade-option=all-de

NH中有一个配置设置“use_identifier_rollback”,它将实体的id设置回其默认值

此设置适用于除“删除孤立项”之外的所有级联选项。(我知道为什么!)

看看

看看

回滚保存时还原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)
//与“使用标识符\u回滚”和“级联选项=全部”一起使用
//但不能使用“级联选项=全部删除孤立项”
int sampleId;//上面的样本
使用(var session=sessionFactoy.OpenSession())
{
使用(var tx=session.BeginTransaction())
{
Sample=session.Get(sampleId);
Assert.That(sampleId,比(0)大);
Assert.False(sample.IsTransient)
删除(样本);
tx.Commit();
}
}
Assert.That(sample.Id,Is.EqualTo(0));
Assert.True(sample.IsTransient)
通过“
use\u identifier\u rollback”
,nhibernate将id设置为“0”或更准确地设置为标识的默认值。我的
IsTransient
属性取决于
Id==0

  • 当实体被删除时,您如何处理这些实体,以防实体是暂时的,或者被删除实体的Id是什么

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

我知道我从来没有使用过它。回滚通常意味着整个工作单元失败,这包括实例化对象的代码。@oskar是的,对于一个新实体来说,这听起来很有道理。但是,当您删除一个实体时,您希望看到什么行为?它现在是暂时的,id是“0”吗?到目前为止,我只想在实体被删除后使用它,因此它的id不重要。它是为了某种死后记录的目的吗?
// 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)