C# 实体框架代码优先-模型更改和两个版本的代码(前模型更改和后模型更改)

C# 实体框架代码优先-模型更改和两个版本的代码(前模型更改和后模型更改),c#,asp.net,entity-framework,entity-framework-migrations,C#,Asp.net,Entity Framework,Entity Framework Migrations,我有两个环境(A和B)共享同一个后台数据库,该数据库使用ASP.NETIdentity2.0框架,因此在下面使用EF。这两个环境可能随时运行不同版本的代码——B版本通常运行较旧的代码(即,在部署到B之前,我将首先部署到A并测试任何更改) 当我向模型添加新属性并利用EF迁移时,新列将添加到基础数据库中。此代码将首先部署到A,并将修改B正在使用的同一数据库。然后,B抛出一个关于在数据库表中找到未知属性(列)的异常 我有办法处理这个问题吗?基本上,我希望不知道新列的代码“忽略”它,或者将其设置为默认值

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

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


我有办法处理这个问题吗?基本上,我希望不知道新列的代码“忽略”它,或者将其设置为默认值。

您可以通过在上下文构造函数中设置空初始化器来防止entity framework检查模型与数据库的匹配:

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

    //Rest of context here

}
public类YourContext:DbContext
{
public YourContext():base(“YourContextConnection”)
{
Database.SetInitializer(null);
}
//这里是上下文的其余部分
}
如果您仅在web.config中为B禁用它,它也可能工作:

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


所以您的环境都指向同一个数据库?是的,我们基本上使用A作为B的暂存环境。您意识到这有多危险吗?是的,这只是我们现有的系统,必须使用它。您应该在SQL Server中为您的B环境启动一个新的数据库。这应该不会超过几分钟。谢谢,大卫。这是否意味着我的A环境将要求初始值设定项为我的支持迁移的初始值设定项,并让B使用空初始值设定项?也就是说,A总是会为B做迁移准备,以使B只假设它处于有效状态?谢谢,我会尝试一下。希望它能工作,但它不能解决最终会遇到的问题,即A和B有相同数据库的危险。此外,如果需要删除列或更改数据类型,会发生什么情况?