1
我有雙向父母和子女關係的父母和子女鏈接的類BidiParent和BidiChildList。如果兒童的父母通過例如更新服務層,新老父母的孩子列表會自動更新以反映變化。同樣,如果父母的孩子列表通過例如添加新的孩子時,孩子的父母會自動更改,就像老父母的孩子列表一樣。我想嘗試構建一個「智能」域模型。雙向協會和NHibernate映射
顯而易見的第一個問題是:這是個好主意嗎?
第二個問題是:是否有可能告訴NHibernate的訪問和修改場 _children或_Parent,而是要考慮財產兒童或家長要與現場完全的代名詞?該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);
}
您是否曾經看到過使用此解決方案的任何缺點? – Rippo 2011-06-08 12:56:02