7

私はEF4を初めて使用し、DbContextクラスを作成するための最良の方法を見つけようとしています。

以下のコードのように、すべてのテーブル/エンティティを1つだけのDbContextクラスに配置することに問題(特にパフォーマンス)はありますか?

public class AllInOneDb : DbContext
{
    public DbSet<Customer> Customers{ get; set; }
    public DbSet<Address> Addresses{ get; set; }
    public DbSet<Order> Order{ get; set; }
    public DbSet<Product> Products{ get; set; }
    public DbSet<Category> Categories{ get; set; }
    // and more and more entities...
}

または、機能のサブセットに基づいてクラスをモデル化する必要がありますか?

public class CustomerDb : DbContext
{
    public DbSet<Customer> Customers{ get; set; }
    public DbSet<Address> Addresses{ get; set; }
    public DbSet<Order> Order{ get; set; }
}

public class ProductDb : DbContext
{
    public DbSet<Product> Products{ get; set; }
    public DbSet<Category> Categories{ get; set; }
    public DbSet<Order> Order{ get; set; } // look Order entity again!
}

ありがとう

4

1 に答える 1

7

特定のビジネスロジックを持つサブエリアがある場合は、それを複数に分割できますDbContext。(これらの小さなコンテキストは、境界コンテキストと呼ばれるドメイン駆動設計にとって重要なパターンに従います)。1つの汎用コンテキストではなく、これらのさまざまなプロセスを対象とするDbContextを作成することには、多くの利点があります。アプリケーションが成長するにつれて、各コンテキストを維持し、その中で必要なロジックを見つけることがはるかに簡単になります。DbContext(多くのDbSetプロパティと多くのクラスの流暢な構成を備えた既存のロジックを単一で追加または変更するよりも優れています)

パフォーマンスは別の考慮事項です。Entity Frameworkがコンテキストのメモリ内モデルを作成する場合、コンテキストが大きいほど、そのメモリ内モデルを生成および維持するために費やされるリソースが多くなります。

複数のコンテキスト間でinstances()を共有する場合Order、エンティティは一度に1つのコンテキストにのみアタッチできます。最初に顧客DbContextから注文を切り離し、製品DbContextに注文を添付します。また、追加、変更、または削除されたエンティティをあるコンテキストから別のコンテキストに移動する場合は注意が必要です(または単に回避する必要があります)。

Order order;
using (var custDb = new CustomerDb()){
   order = custDb.FirstOrDefault(o=>OrderId == "orderid");
}
using (var prodDB = new ProductDb()){
   prodDB.Attach(order);
   ...
}
于 2012-04-14T11:32:24.510 に答える