NHibernate / Castle.ActiveRecord; удалить не удалось, так как строка была обновлена ​​в той же транзакции - PullRequest
1 голос
/ 07 января 2012

это действительно сумасшедший сейчас. Я пытаюсь удалить некоторые объекты, которые имеют иерархические отношения друг с другом, но каким-то образом NHibernate (или ActiverRecord) сначала обновляет отношения (foreigen keys), а затем пытается удалить в той же транзакции, но удаление не удается из-за проверки параллелизма ( оптимистическая блокировка всего).

Псевдокод моих занятий:

[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

1 Ответ

2 голосов
/ 10 января 2012

то, что вы ищете, является обратным. Тогда часть «многие к одному» отвечает за ассоциацию. Примечание: Вы должны позаботиться о том, чтобы родительская ссылка на поле всегда сохранялась

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