如何允许EF4 CodeFirst数据库初始化程序在开发中运行,但不能在生产中运行

Kal*_*exx 3 c# database deployment entity-framework entity-framework-4.1

我正在尝试在线部署我的第一个alpha版本的系统,以便少数人开始使用.在开发时,我DropCreateDatabaseOnModelChange<TContext>每次模型更改时都会大量使用(我现在没有它在我面前,所以我无法验证确切的名称)重新初始化我的开发数据库.这发生在Global.asax.

但是,我不希望这种情况发生在我的网络主机上,其他人正在输入真实数据.我需要自己处理所有数据库迁移,以便保留数据.

我曾考虑使用#ifdef DEBUG标签来阻止调用数据库初始化程序,但我不喜欢这种解决方案.现在,我已经部署了调试版本,所以如果他们遇到任何错误,我很容易看到并调试它们(这是非常非常的alpha,因此只有少数几个人正在使用它并知道预期错误).

我还有哪些其他选项可以防止Prod DB首先被EF4代码丢弃?

Lad*_*nka 7

怎么样控制反转:

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)


Ser*_*eit 6

正如@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)