2008-10-12 56 views
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); 
} 

回答

1

回答我的問題:我需要使用一個命名策略,如docs詳細說明。 RTFM的權利?

<class name="Parent"> 
    <property name="Name" /> 
    <bag name="Children" access="field.pascalcase-underscore"> 
     <key /> 
     <one-to-many class="Child" /> 
    </bag> 
</class> 
<class name="Child"> 
    <property name="Name" /> 
    <many-to-one name="Parent" access="field.pascalcase-underscore" /> 
</class> 
+0

您是否曾經看到過使用此解決方案的任何缺點? – Rippo 2011-06-08 12:56:02