3

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

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

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

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

4

5 回答 5

7

控制反转呢:

var initializer = container.Resolve<IDatabaseInitializer<Context>>();
Database.SetInitializer(initializer);

根据您的 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");
    }
}
于 2011-03-25T14:01:14.840 回答
6

正如@Johann 所说,这ConditionalAttribute可能是这里的清洁解决方案:

[Conditional("DEBUG")]
private void InitializeDb()
{
    // Initializer code here
    // DropCreateDatabaseOnModelChange<TContext>
}

在 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();
}
于 2011-03-25T14:57:03.263 回答
4

您总是可以创建一个新的配置(除了调试和发布)。然后,您将为新配置定义一个条件编译符号。例如,如果我创建了一个名为 LocalDebug 的新配置(在默认调试时具有相同的设置),那么我会将 LOCALDEBUG 添加到条件编译符号中。有了这个定义,您可以使用:

#if LOCALDEBUG
  //do database stuff
#endif

然后你仍然可以部署内置的调试配置,这部分不会触发。

于 2011-03-25T14:00:40.150 回答
2

您可以使用 Conditional 属性,但它与 #ifdef 没有太大区别

于 2011-03-25T13:51:48.890 回答
0

如果您在开发中使用 sql express 而不是在您的生产框中,您可以按连接进行过滤。

protected void Application_Start(object sender, EventArgs e)
{
  using (var db = new MyDb())
  {
    if (db.Database.Connection.DataSource.IndexOf("sqlexpress", StringComparison.InvariantCultureIgnoreCase) > -1)
    {
        Database.SetInitializer(new MyDbInitializer());
    }
  }
}
于 2012-01-18T20:13:58.840 回答