Определить платформу Entity Framework SetInitializer в web.config

Прямо сейчас, в разработке у меня есть следующий код в файле Global.asax.cs, который вызывает Entity Framework (v4.1) SetInitializer с помощью моего метода SeedSampleData​​strong > , Все это прекрасно работает.

Однако я хотел бы сохранить параметр стратегии "SetInitializer" с помощью параметра web.config, чтобы я мог создать развертывание script, которое автоматически установит его на new System.Data.Entity.CreateDatabaseIfNotExists<EfDbContext>() вместо моего метода seed во время производственного развертывания.

Причина, по которой нужно переместить это в файл web.config, заключается в том, что при развертывании нового развертывания на рабочем сервере я хочу убедиться, что я случайно не оставил инициализатор семени в коде.

protected void Application_Start()
{
  //TODO: Figure out how to move the following lines to web.config and have a deployment script modify it when going to production.

  //This line is for production
  //System.Data.Entity.Database.SetInitializer(new System.Data.Entity.CreateDatabaseIfNotExists<EfDbContext>());

  //This line is for development
  System.Data.Entity.Database.SetInitializer(new Domain.Concrete.SeedSampleData());

  //... Remainder of Application_Start calls here...
}

Ответы

Ответ 1

Если вы обновляетесь до EF 4.3 (это все равно хорошая идея), то вы можете использовать что-то вроде этого в своей веб-конфигурации:

<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>

  <entityFramework>
    <contexts>
      <context type=" Blogging.BlogContext, MyAssembly">
        <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" />
      </context>
    </contexts>
  </entityFramework>
</configuration>

Rowan подробно описал это здесь: http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-configuration-file-settings.aspx

Если вы действительно хотите использовать 4.1, то вместо этого используется более старый синтаксис. Я написал об этом здесь: http://blog.oneunicorn.com/2011/03/31/configuring-database-initializers-in-a-config-file/

Ответ 2

Если я правильно понимаю, ваш инициализатор SeedSampleData используется только для целей отладки?

Я не знаю, есть ли параметр конфигурации для управления этим, но вы можете использовать директивы препроцессора:

#if DEBUG
System.Data.Entity.Database.SetInitializer(new Domain.Concrete.SeedSampleData());
#else
System.Data.Entity.Database.SetInitializer(new System.Data.Entity.CreateDatabaseIfNotExists<EfDbContext>();
#endif

(предполагая, конечно, что вы не развертываете сборки отладки в процессе производства...)