0

EF Code First Approach と 1:m の関係で外部キーを定義することについて混乱しています。

さまざまなチュートリアルを見ると、さまざまな方法がありますが、違いはわかりません。

2 つのモデルがProductありCategory、1 つのカテゴリに多くの製品があるとします。

public class Product
{
    public int ProductId { get; set; }
    public int CategoryId { get; set; }
    public string Name { get; set; }

    // Method 1a
    public virtual ICollection<Category> Categories {get; set; }

    // Method 1b
    public virtual List<Category> Categories {get; set; }

    // Method 1c
    public Category Category {get; set; }

    // Method 1d
    public virtual Category Category { get; set; }
}

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }

    // Method 2a
    public List<Product> Products { get; set; }

    // Method 2b
    public ICollection<Product> Products { get; set; }

    // Method 2c
    public virtual List<Product> Products { get; set; }

    // Method 2d
    public virtual ICollection<Product> Products { get; set; }
}

public class ExampleContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Category> Categories { get; set; }
}

ICollection製品テーブル: /を使用しても違いはないと思いますListが、いつ 1a/1b、1c、または 1d を使用するのですか?

ICollectionカテゴリ表: /を使用しても違いはないと思いますListが、いつ 2a、2b、2c を使用するのですか?

4

1 に答える 1

0

1a-d

そのまま-1cまたは1dProductCategoryある1 : n必要があります。

プロパティを作成するかどうかはvirtual、あなた次第です。遅延読み込みにしたい場合は、仮想にする必要があります。常に熱心な読み込み (例: ) を使用する場合は、修飾子Includeを省略できます。virtual

2a-d

それはあなたが示すオプションのいずれかです。

EFは完全に満足しています

public (virtual) ICollection<Category> Categories {get; set; }

繰り返しますが、遅延読み込みを有効にするかどうかはあなた次第です。

ICollection<T>のような実装を強制する必要はありませんList<T>。プロパティが として定義されICollection<T>、具象型がList<T>orになることがよくありますHashSet<T>MSDNによると、後者は高性能のセット操作を提供します。エンティティのコンストラクターで具体的なコレクションを初期化できます。

関連を表現するためにProduct.Categoryとの両方を定義する必要はありません。Category.Products必要なプロパティは、ビジネス ロジックによって異なります。

于 2013-05-28T06:50:39.533 に答える