首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate / Castle.ActiveRecord;删除失败,因为在同一事务中更新了行

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

Stack Overflow用户
提问于 2012-01-07 22:10:37
回答 1查看 410关注 0票数 1

现在这真的很疯狂。我正在尝试删除一些彼此具有历史关系的对象,但不知何故,NHibernate (或ActiverRecord)首先更新关系(外部键),然后在同一事务中尝试删除,但由于并发检查(乐观锁定全部),删除失败。

我的类的伪代码:

代码语言:javascript
复制
[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个东西。我试着描述一下这个结构:

代码语言:javascript
复制
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输出时,它做了以下愚蠢的事情:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2012-01-11 03:54:45

你正在寻找的是相反的。然后多对一部分负责关联。注意:您必须注意始终维护框的父引用

代码语言:javascript
复制
[HasMany(Inverse = true)]
public virtual IList<Box> Children {get;set;}
[HasMany(Inverse = true)]
public virtual IList<Content> Content {get;set;}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8770278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档