2012-04-14 5 views
5

Я новичок в EF4, и я пытаюсь найти лучший способ создать свой класс (ы) DbContext.Должен ли Eb 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. (Эти меньшие контексты следуют шаблону, критическому для проектирования, управляемого доменом , называемого ограниченным контекстом). Существует ряд преимуществ для создания DbContexts, которые нацелены на эти различные процессы, а не на один универсальный контекст . По мере роста вашего приложения будет намного проще поддерживать каждый контекст, а также находить нужную вам логику. (Лучше, чем добавление или изменение существующей логики в одиночном DbContext со многими DbSet свойствами и хорошей конфигурацией для многих классов)

Производительность - еще одно соображение. Когда Entity Framework создает модель контекста in-memory , чем больше контекст, тем больше ресурсов расходуется до , создавая и поддерживая эту модель в памяти.

Если вы собираетесь обмениваться экземплярами (Order) между несколькими контекстами, Entity может быть привязан только к одному контексту за раз. Сначала отсоедините заказ от клиента DbContext и прикрепите заказ к продукту 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

Смежные вопросы