现在这真的很疯狂。我正在尝试删除一些彼此具有历史关系的对象,但不知何故,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
发布于 2012-01-11 03:54:45
你正在寻找的是相反的。然后多对一部分负责关联。注意:您必须注意始终维护框的父引用
[HasMany(Inverse = true)]
public virtual IList<Box> Children {get;set;}
[HasMany(Inverse = true)]
public virtual IList<Content> Content {get;set;}https://stackoverflow.com/questions/8770278
复制相似问题