NHibernate/Castle.ActiveRecord;删除失败,因为行已在同一事务中更新



这真是太疯狂了。我试图删除一些彼此之间具有层次关系的对象,但不知何故,NHibernate(或ActiverRecord)首先更新了关系(外键),然后在同一事务中尝试删除,但由于并发检查(乐观锁定所有对象),删除失败。

我的类的伪代码:

[ActiveRecord]
public class Box : ActiveRecordBase
{
  [PrimaryKey]
  public virtual int BoxId{get;set;}
  [BelongsTo]
  public virtual Box TopLevelBox{get;set;}
  [BelongsTo]
  public virtual Box Parent {get;set;}
  [HasMany]
  public virtual IList<Box> Children {get;set;}
  [HasMany]
  public virtual IList<Content> Conten{get;set;}
}
[ActiveRecord]
public class Content : ActiveRecordBase
{
  [PrimaryKey]
  public virtual int ContentId{get;set;}
  [BelongsTo]
  public virtual Box Box{get;set;}
}

我有3个盒子和3个内容物。我试图描述结构:

Box1.Parent = null;
Box1.TopLevelBox = Box1;
Box1.Children = {Box2,Box3};
Box1.Content = {Conten1};
Box2.Parent = Box1;
Box2.TopLevelBox = Box1;
Box2.Children = {};
Box2.Content = {Content2};
Box3.Parent = Box1;
Box3.TopLevelBox = Box1;
Box3.Children = {};
Box3.Content = {Content3};
Content3.Box = Box3;
Content2.Box = Box2;
Content1.Box = Box1;

当我让NHibernate输出时,它会做以下愚蠢的事情:

UPDATE box1 SET toplevelbox = NULL WHERE [optimistic locking all checks];
UPDATE box2 SET parent = NULL, toplevelbox = NULL WHERE [optimistic locking all checks];
UPDATE box3 SET parent = NULL, toplevelbox = NULL WHERE [optimistic locking all checks];
UPDATE content1 SET box = NULL WHERE [optimistic locking all checks];
UPDATE content2 SET box = NULL WHERE [optimistic locking all checks];
UPDATE content3 SET box = NULL WHERE [optimistic locking all checks];
DELETE box1 WHERE [optimistic locking all checks but with] AND topleveobox = box1;
// Of cause this last check fails and my transaction get's a rollback

这里的沃荣是什么?如何阻止NHibernat(或ActiveRecord)进行那些愚蠢的更新?

我真的很绝望,需要帮助。

问候

Juy Juka

您要查找的内容是相反的。然后由多对一的部分负责该协会。注意:您必须注意盒子的父引用始终保持

[HasMany(Inverse = true)]
public virtual IList<Box> Children {get;set;}
[HasMany(Inverse = true)]
public virtual IList<Content> Content {get;set;}

最新更新