Kal*_*exx 3 c# database deployment entity-framework entity-framework-4.1
我正在尝试在线部署我的第一个alpha版本的系统,以便少数人开始使用.在开发时,我DropCreateDatabaseOnModelChange<TContext>
每次模型更改时都会大量使用(我现在没有它在我面前,所以我无法验证确切的名称)重新初始化我的开发数据库.这发生在Global.asax
.
但是,我不希望这种情况发生在我的网络主机上,其他人正在输入真实数据.我需要自己处理所有数据库迁移,以便保留数据.
我曾考虑使用#ifdef DEBUG
标签来阻止调用数据库初始化程序,但我不喜欢这种解决方案.现在,我已经部署了调试版本,所以如果他们遇到任何错误,我很容易看到并调试它们(这是非常非常的alpha,因此只有少数几个人正在使用它并知道预期错误).
我还有哪些其他选项可以防止Prod DB首先被EF4代码丢弃?
怎么样控制反转:
var initializer = container.Resolve<IDatabaseInitializer<Context>>();
Database.SetInitializer(initializer);
Run Code Online (Sandbox Code Playgroud)
根据您的IoC配置,您将返回开发或生产初始化程序.您可以为每个构建配置配置不同的配置文件,这样您也可以对IoC容器进行不同的配置.
public class ThrowExceptionInitializer : IDatabaseInitializer<Context>
{
public InitializeDatabase(Context context)
{
// Custom exception
throw new InvalidVersionException("The new application version is not supported by the database version");
}
}
Run Code Online (Sandbox Code Playgroud)
正如@Johann所说,这ConditionalAttribute
可能是解决方案:
[Conditional("DEBUG")]
private void InitializeDb()
{
// Initializer code here
// DropCreateDatabaseOnModelChange<TContext>
}
Run Code Online (Sandbox Code Playgroud)
在Global.asax中:
public void Application_Start // or wherever it is you're initializing
{
// This will only be called if the DEBUG constant is defined
InitializeDb();
}
Run Code Online (Sandbox Code Playgroud)