双方向の親子関係で親と子をリンクするクラス BidiParent と BidiChildList があります。子の親がサービス層などによって更新されると、変更を反映するために、古い親と新しい親の子リストが自動的に更新されます。同様に、新しい子を追加するなどして親の子リストが更新されると、古い親の子リストと同様に、子の親が自動的に変更されます。「スマートな」ドメイン モデルの構築を試みたいと考えています。
最初の質問は、明らかに、次のとおりです。これは良い考えですか?
2 番目の質問は、フィールド_Childrenまたは _Parentにアクセスして変更するように NHibernate に指示することはできますか? NHibernate は内部フィールドを読み込んで保存する必要がありますが、HQL または LINQ クエリはパブリック プロパティを使用する必要がありますか?
public class BidiParent<C, P> { ... }
public class BidiChildList<C, P> : IList<C> { ... }
public class Parent {
public string Name { get; set; }
public IList<Child> Children {
get { return ChildrenBidi; }
set { ChildrenBidi.Set(value); }
}
private BidiChildList<Child, Parent> ChildrenBidi {
get { return BidiChildList.Create(this, p => p._Children, c => c._Parent, (c, p) => c._Parent = p); }
}
internal IList<Child> _Children = new List<Child>();
}
public class Child {
public string Name { get; set; }
public Parent Parent {
get { return ParentBidi.Get(); }
set { ParentBidi.Set(value); }
}
private BidiParent<Child, Parent> ParentBidi {
get { return BidiParent.Create(this, p => p._Children, () => _Parent, p => _Parent = p); }
}
internal Parent _Parent = null;
}
[Test]
public void MultilevelConstruction_Succeeds() {
var p = new Parent {
Name = "Bob",
Children = new List<Child> {
new Child { Name = "Kate" },
new Child { Name = "Billy" }
}
};
Assert.AreEqual(2, p.Children.Count);
Assert.AreEqual("Kate", p.Children[0].Name);
Assert.AreEqual("Billy", p.Children[1].Name);
Assert.AreSame(p, p.Children[0].Parent);
Assert.AreSame(p, p.Children[1].Parent);
}