0

User エンティティに国 ID のリストがあり、IList として保持されているシナリオがあります。

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() でマッピングする場合、これを行う方法が見つからないようです。何か案は?

4

1 に答える 1

3

Fluent NHibernate で使用されるコレクションの変換は、(ここで説明されているように)次のようになります。

// <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 />

これらのマッピングの本質/違いは、コレクションのパフォーマンスについてのドキュメントとAyende の投稿で詳しく説明されています<list>:)抽出:

... while<set/>は一意の要素の順序付けられていないコレクションであり、 a<list/> は順序が重要な要素のコレクションであり、要素の重複が許可されています...

つまり、重複する可能性があるため、キーインデックス<list>の列にPK を保持する必要があります。

あなたの場合、<bag>(明示的な呼び出しなしで) マッピングする.AsList()だけで十分効率的です。インデックス列を削除し、PK をキー要素(User_id、TradeCountryId) に移動できます。

注: C# IList では、さらに「同じ」要素を使用できます。ビジネス レイヤーで確認する必要があります。

于 2012-12-11T20:42:36.453 に答える