2016-10-07 11 views
0

私は、多対多の関係ではHashSetののEX多対多の関係でHashSetが必要なのはなぜですか?

this.Supplier = new HashSet<supplier>(); 

を使用する多くのチュートリアルを発見しました。私は上記のコードをテストし、

public xxxx() 
    { 
     this.xxxx = new HashSet<xxxx>(); 
    } 

を削除した場合でも、SOMのチュートリアルが

public partial class Product 
{ 
    public Product() 
    { 
     this.Supplier = new HashSet<supplier>(); 
    } 

    public long ProductID { get; set; } 
    public string ProductName { get; set; } 

    //navigation property to Supplier 
    public virtual ICollection<supplier> Supplier { get; set; } 
} 

public partial class Supplier 
{ 
    public Supplier() 
    { 
     this.Product = new HashSet<product>(); 
    } 

    public long SupplierID { get; set; } 
    public string SupplierName { get; set; } 

    // navigation property to Product 
    public virtual ICollection<product> Product { get; set; } 
} 

(無多かれ少なかれ)HashSetのせずに以下のコードを使用していない私はまだ関連付けテーブルを持って、多対多関係。

なぜHashSetが必要ですか?両方のテーブルモデルでICollectionで定義された

+0

その関係を定義するナビゲーションプロパティ( 'ICollection ')です。コンストラクタ内のコードは初期化していますので、 'null ' –

答えて

2

通常、多対多の関係:

public virtual ICollection<supplier> Supplier { get; set; } 

public virtual ICollection<product> Product { get; set; } 

モデルのICollectionの存在はEFがそれらの派生クラスを作成することができ、遅延ロードが有効になっていることを意味します。モデルの世代の内部HashSetの使用について

、CHRISVはHashSet in EF many to manyで述べている:

HashSetのは、例えば、単一の項目の大規模なセットを検索、 操作の多くは非常に効率的であるハッシュテーブルを実装。

デフォルトでHashSetの使用は主に、このようなのYuval Itzchakov等以外の非ヌル値の効率の理由から、に基づいてEntity Framework:Why the collection type of entity class need to be instanced in the default constructor?で述べている:それはあるその2つの値を保証するため

A HashSetのに使用されています GetHashCodeメソッドとEqualsメソッドを参照することによって等価性が確認されます)は、コレクション内に1回だけ表示されます。 はい、具体的な型を ICollection<T>を実装するすべての型に変更できます。

上記の説明は次のように要約することができる「HashSetは、各関連モデル部材間平等を保証モデルのコンストラクタ内部ICollectionインターフェースの初期化ステップです」。 EF自体はテーブルモデルに対してICollectionにどのような実装を適用しても構わないので、HashSet<T>の代わりにList<T>をコンストラクタに置き換えても多対多の関係は影響を受けません。

テンプレートモデル(.ttファイル)の中に、あなたはそれがICollectionを実装し、デフォルトでHashSet<T>を生成するために、これらの行が表示されることがあります

foreach (var navigationProperty in collectionNavigationProperties) 
{ 
#> 
    this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>(); 
<# 
} 

あなたはモデルがあるときHashSet<T>初期設定を削除または変更して実験を行っていることしかし、私は大量のデータ操作のためにそれを削除することを推奨しませんでした。