2012-04-14 5 views
5

EF4를 처음 접했고 DbContext 클래스를 만드는 가장 좋은 방법을 찾으려고합니다.EF의 DbContext에 모든 테이블이 있어야합니까?

아래 코드와 같이 하나의 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로 분할 할 수 있습니다. ()이 작은 컨텍스트는 도메인 기반 디자인 에 매우 중요한 패턴을 따릅니다 (바운드 컨텍스트). 하나의 다목적 컨텍스트가 아니라 이러한 다양한 프로세스를 대상으로하는 DbContext를 만드는 데 많은 이점이 있습니다. 응용 프로그램이 성장함에 따라 각 컨텍스트를 유지 관리하고 필요한 논리를 쉽게 찾을 수 있습니다. (다수의 경우 DbSet 속성이 있고 유창한 구성을 사용하는 단일 DbContext의 기존 논리를 추가하거나 수정하는 것보다 낫습니다.)

성능은 또 다른 고려 사항입니다. Entity Framework에서 컨텍스트의 메모리 내 모델을 만들면 이 메모리 내 모델을 생성하고 유지 관리하는 데 더 많은 리소스가 소비됩니다.

여러 컨텍스트간에 인스턴스 (Order)를 공유하려는 경우 엔티티는 한 번에 하나의 컨텍스트에만 첨부 할 수 있습니다. 먼저 Customer DbContext에서 Order를 분리하고 Order를 Product DbContext에 연결합니다. 그리고 추가, 수정 또는 삭제 된 엔티티를 하나의 컨텍스트에서 다른 컨텍스트로 이동하는 것에 조심해야합니다.

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

관련 문제