Определить платформу Entity Framework SetInitializer в web.config
Прямо сейчас, в разработке у меня есть следующий код в файле Global.asax.cs, который вызывает Entity Framework (v4.1) SetInitializer с помощью моего метода SeedSampleDatastrong > , Все это прекрасно работает.
Однако я хотел бы сохранить параметр стратегии "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
(предполагая, конечно, что вы не развертываете сборки отладки в процессе производства...)