2012-04-14 2 views
5

私はEF4が新しく、私はDbContextクラスを作成する最良の方法を見つけようとしています。EFの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! 
} 

おかげ

答えて

7

あなたが特定のビジネス・ロジックを持つサブエリアを持っている場合は、複数のDbContextに分割することができます。 (これらのより小さいコンテキストは、ドメインドリブンデザイン に不可欠なパターンに従います(Bounded Contexts)。汎用の コンテキストではなく、これらのさまざまなプロセスをターゲットとするDbContextを作成することには、多くの利点があります。アプリケーションが大きくなるにつれ、各コンテキストを維持し、必要なロジックを見つけることがずっと簡単になります。 (多くのクラスで多数のDbSetプロパティと流暢な構成を持つ単一のDbContextの既存のロジックを追加または変更するよりも良い)

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

複数のコンテキスト間でインスタンス(Order)を共有する場合、Entityは一度に1つのコンテキストにのみ接続できます。 Customer DbContextからOrderを分離し、Product DbContextにOrderを添付します。また、追加、変更、または削除されたエンティティをあるコンテキストから別のコンテキストに移動することに注意する必要があります。

Order order; 
using (var custDb = new CustomerDb()){ 
    order = custDb.FirstOrDefault(o=>OrderId == "orderid"); 
} 
using (var prodDB = new ProductDb()){ 
    prodDB.Attach(order); 
    ... 
} 
+0

境界のあるコンテキストは、間違いなく良い考えです。パフォーマンスの低下は無視できます...モデルの作成には時間がかかりますが、起動時にのみ発生します。できるだけ早くそれを保つために多くのトリックがあります。いくつかのビデオの詳細:http://pluralsight.com/training/Courses/TableOfContents/efarchitecture – Jowen

関連する問題