NHibernate を使用して、単純な 1 対多の関係/階層を作成しようとしています。孤児を自動的に削除したいのですが、現在そうしようとしても ObjectDeletedException が発生します。誰かが私が間違っていることを教えてくれるかどうか疑問に思っています。
編集:
ルート Foo をロードしてから、子をセッション外に削除して、1 つまたは複数の子を孤立させることを指定する必要がありました。その後、2 番目のセッションで SaveOrUpdate(root) を呼び出すと、例外が発生します。デタッチされて変更されたオブジェクトと、データベースに永続化されているオブジェクトとの間の子のリストの違いを修正するにはどうすればよいですか?
問題のサンプル コードは次のようになります。
Foo foo = new Foo();
Foo child1 = new Foo();
Foo child2 = new Foo();
foo.Children.Add(child1);
child1.Children.Add(child2);
// session #1
session.SaveOrUpdate(foo);
// so far, so good
// outside of any session
foo.Children.Clear();
// session #2
PutFoo(foo); // results in ObjectDeletedException
永続化されるオブジェクト:
class Foo
{
private IList<Foo> children = new List<Foo> children;
public virtual int Id { get; private set; }
public IList<Foo> Children
{
get { return children; }
set { children = value; }
}
}
FluentNHibernate マッピング:
class FooMap : ClassMap<SyncDir>
{
public FooMap()
{
Id(x => x.Id);
base.HasMany(x => x.Children).Cascade.AllDeleteOrphan();
}
}
タイプ Foo のオブジェクトを永続化するために使用されるメソッド:
void PutFoo(Foo foo)
{
using (var session = factory.OpenSession())
using (var transaction = factory.BeginTransaction())
{
session.SaveOrUpdate(foo);
transaction.Commit();
}
}