2012-12-11 53 views
0

我有一個場景,用戶實體有一個國家id的列表,保持爲IList。當使用流利NHibernate和AsList()時指定主鍵

public virtual IList<int> TradeCountries { get; protected set; } 

目前,這被映射爲

HasMany(x => x.TradeCountries).Element("TradeCountryId").AsList(x => x.Column("TradeCountryIndex")); 

產生的表的定義如下

create table TradeCountries (
    User_id INT not null, 
    TradeCountryId INT null, 
    TradeCountryIndex INT not null, 
    primary key (User_id, TradeCountryIndex) 
) 

這一切工作正常 - 但我想就TradeCountries的PK是User_id,TradeCountryId。在使用AsList()進行映射時,我似乎無法找到這樣做的方法。有任何想法嗎?

+0

你想對你的主鍵由兩個領域? (User_id和TradeCounryId) –

+0

爲什麼要在PK中使用TradeCountryId?唯一性約束? NHibernate使用PK中的索引,因爲這對NH來說很重要。你真的需要存儲每個contry在集合中的位置嗎? –

+0

@OskarBerggren我想把它作爲一個列表映射,以避免映射組件時出現的'刪除所有/重新插入所有'行爲或包 –

回答

3

在功能NHibernate使用集合的轉化進入(as described here)這種方式:

// <set> 
public virtual ISet<Child> Children { get; set; }  
HasMany(x => x.Children); // <set /> 

// <bag> 
public virtual IList<Child> Children { get; set; }  
HasMany(x => x.Children); // <bag /> 

// <list> 
public virtual IList<Child> Children { get; set; }  
HasMany(x => x.Children).AsList(...; // <list /> 

實質/被詳細描述在文檔Understanding Collection performanceAyende's post: <list>)描述這些映射的差異。 提取

...而<set/>是一個無序的集合獨特的元素,一個<list/> 是元素的集合,其中爲了此事,並重復 元素允許...

換句話說,當使用<list>時,您必須保留索引列上的PK,因爲可能有重複。

在你的情況,只是<bag>映射(沒有明確.AsList()調用)可能是效率不夠高,你可以刪除索引列,並移動到PK的關鍵元素(USER_ID,TradeCountryId)。

注:C#的IList仍然允許有更多的「相同」的元素,你應該檢查它的業務層上