EF 4.1 сначала закодируйте — один контекст или несколько контекстов?

#ef-code-first

#ef-code-first

Вопрос:

Может ли кто-нибудь дать какой-либо совет относительно того, является ли наилучшей практикой иметь один контекст или несколько контекстов?

Например, должен ли у меня быть один контекст следующим образом:

    public class MyContext
      : DbContext
  {
      public DbSet<Company> Companies { get; set; }

      public DbSet<Country> Countries { get; set; } 

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
          modelBuilder.Configurations.Add(new CountryConfiguration());
          modelBuilder.Configurations.Add(new CompanyConfiguration());
          base.OnModelCreating(modelBuilder);
      }
  }
  

Или было бы лучше создать отдельный контекст для компаний и стран? Итак, ConpanyContext и CountryContext, которые оба будут предоставлять одно свойство DbSet.

Возможно, это просто личный выбор, но наша база данных будет состоять из сотен объектов. Поэтому я хотел бы получить это право для начала.

Большое спасибо,

Пол.

Ответ №1:

Простое эмпирическое правило: одна схема / домен, один контекст.

Комментарии:

1. Я хотел бы сделать это таким образом, если производительность в порядке. Я немного обеспокоен тем, какой будет производительность при создании экземпляра контекста, когда ему приходится иметь дело с более чем 100 конфигурационными классами в OnModelCreating. Это становится еще большей проблемой при использовании этого в службе WCF, при котором при каждом вызове службы будет создаваться новый экземпляр.

2. @Paul: OnModelCreating вызывается ОДИН РАЗ , а не каждый раз, когда вы создаете экземпляр.

Ответ №2:

Если это вообще возможно, попробуйте разделить их по значимым строкам.

100 объектов в контексте могут показаться плохими, но подумайте о вашей альтернативе, 100 различных контекстах?

Затем вам пришлось бы делать такие вещи, как

 using(CompanyContext cc = new CompanyContext)
{
}

using (CountryContext cc = new CountryContext)
{
}
  

Если бы вам нужно было запросить несколько таблиц, у вас были бы вложенные контексты, и это было бы некрасиво.
У вас начнут возникать такие вещи, как

 using(CompanyContext comp = new CompanyContext)
    {
        using (CountryContext country = new CountryContext)
       {
       }
    }
  

Я не могу представить, что таким образом можно было бы повысить производительность, но я уверен, что обслуживание было бы затруднительным.