2012-01-07 3 views
1

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

ПСЕВДОКОД из моих классов:

[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 Содержание. Я пытаюсь описать strucutre:

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 

Что worong здесь? Как остановить NHibernat (или ActiveRecord) от выполнения этих глупых обновлений?

Я действительно отчаялся и нуждаюсь в помощи.

Приветствия

Juy Juka

ответ

2

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

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