【问题标题】:Entity Framework Code First - Model Change with two versions of code (pre model change and post model change)实体框架代码优先 - 具有两个版本代码的模型更改(模型更改前和模型更改后)
【发布时间】:2014-07-22 13:45:44
【问题描述】:

我有两个环境(A 和 B)共享同一个后备数据库,这个数据库使用 ASP.Net Identity 2.0 框架,因此在下面使用 EF。这两个环境可能随时运行不同版本的代码——B 版本通常运行较旧的代码(即我会先部署到 A 并测试任何更改,然后再部署到 B)。

当我向模型添加新属性并利用 EF 迁移时,新列将添加到基础数据库中。此代码将首先部署到 A,并将修改 B 正在使用的同一数据库。 B 然后抛出关于在数据库表中找到未知属性(列)的异常。

有什么办法可以解决这个问题吗?基本上我希望不知道新列的代码“忽略”它 - 或将其设置为默认值。

【问题讨论】:

  • 所以你的环境都指向同一个数据库?
  • 是的,我们基本上使用 A 作为 B 的暂存环境。
  • 你知道这有多危险吗?
  • 是的——这只是我们现有的并且必须使用的系统。
  • 你真的应该在你的 SQL Server 中为你的 B 环境启动一个新数据库。这应该不会超过几分钟。

标签: c# asp.net entity-framework entity-framework-migrations


【解决方案1】:

您可以通过在上下文构造函数中设置 null 初始化器来防止实体框架检查模型是否与数据库匹配:

public class YourContext : DbContext
{
    public YourContext() : base("YourContextConnection")
    {
        Database.SetInitializer<YourContext>(null);
    }

    //Rest of context here

}

如果您在 web.config 中为 B 禁用它也可能有效:

<entityFramework>
    <contexts>
        <context type="YourNamespace.YourContext, YourAssembly" disableDatabaseInitialization="true" />
    </contexts>
</entityFramework>

【讨论】:

  • 谢谢,大卫。这是否意味着我的 A 环境将要求初始化程序成为我启用迁移的初始化程序,并让 B 使用 null 初始化程序? IE。 A 总是会进行迁移以准备 B 假设它处于有效状态?
  • 谢谢,我试试看。
  • 希望它有效,但它并不能解决您最终会遇到的问题,即 A 和 B 拥有相同数据库的危险。此外,如果您需要删除列或更改数据类型?
猜你喜欢
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 2013-06-05
  • 1970-01-01
  • 2013-06-01
  • 2020-04-10
  • 1970-01-01
相关资源
最近更新 更多