2013-12-20 58 views
3

所以,我有具有相關聯的列表,像這樣的NHibernate的實體:映射INTS的名單到NHibernate的實體

public class CountSet{ 

    //Some other code here 

    private readonly IList<int> _instanceCounts; 

    public virtual IEnumerable<int> InstanceCounts 
    { 
     get { return _instanceCounts; } 
     set 
     { 
      _instanceCounts.Clear(); 
      foreach (var instanceCount in value.Distinct()) 
      { 
       _instanceCounts.Add(instanceCount); 
      } 
     } 
    } 
} 

和AM映射與功能NHibernate的實體,使用自動映射,但與重寫映射列表,像這樣:

mapping.HasMany(x => x.InstanceCounts) 
      .Table(@"CountSetsInstanceCounts") 
      .KeyColumn(@"InstanceCountSetId") 
      .Element(@"InstanceCount"); 

這似乎是正確創建XML HBM,它看起來像這樣:

<bag table="CountSetsInstanceCounts" name="InstanceCounts" 
    access="field.camelcase-underscore" inverse="true" 
    cascade="all-delete-orphan"> 
    <key> 
     <column name="InstanceCountSetId"/> 
    </key> 
    <element type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, "> 
     <column name="InstanceCount"/> 
    </element> 
</bag> 

這看起來對我來說是正確的。但是,當我嘗試將這些實體持久存儲到數據庫時,該實體被正確保存,但收集不是。

有關可能發生什麼的任何建議?隨時索取更多信息。

回答

1

你幾乎沒有。你的映射是正確的,而C#實體也是如此。問題是,int不能通過「反向」設置進行管理,因爲它不是一個實體。它必須設置爲inverse="false"

調整你的映射是這樣的:

mapping.HasMany(x => x.InstanceCounts) 
    .Table(@"CountSetsInstanceCounts") 
    .KeyColumn(@"InstanceCountSetId") 
    .Element(@"InstanceCount") 
    .Not.Inverse() 
; 
+0

明白了一個。謝謝。有沒有任何地方可以記錄這種東西,因爲我檢查了nhibernate文檔,但是找不到任何東西? – RoryB

+0

老實說,我不確定;)Nhibernate是一個了不起的工具,但文檔不是最好的;) –

0

這基本上是因爲您的自定義setter,它使用後臺字段。 因此,nhibernate沒有引用對象來跟蹤更改。

你有一些選項來解決它

a)拆下定製邏輯和簡單的使用

public virtual IEnumerable<int> InstanceCounts 
{ 
    get; 
    set; 
} 

這應該與您當前的測繪工作,因爲NH可以跟蹤自動性質的變化。

b)更改您的映射以指定訪問:.Access.CamelCaseField() 要使其工作,還必須將支持字段的名稱更改爲不以下劃線開頭。

附註:您將後臺字段定義爲只讀。如果你暴露你的財產的設置者,這並沒有什麼意義。

如果您想擁有隻讀屬性,請刪除setter並可能實現一種方法來設置值列表。 或者,如果您不需要只讀標誌,仍然希望有後備字段,更改您的代碼

public virtual IEnumerable<int> InstanceCounts 
{ 
    get { return instanceCounts; } 
    set { instanceCounts = value.ToList(); } 
}