0

我不担心回滚(即:Down() 方法),并且希望始终处理最新的代码修改,所以我没有使用代码迁移。

我改变了这个:

 int SomeProperty {get; set;}

对此:

 int? SomeProperty {get; set;}

然后我修改了数据库模式(更改了 SomeProperty 列以允许 NULLS)。

尽管这是最后一部分,但我仍然收到错误消息:

The model backing the <Database> context has changed ...

如果(int to int?)是我所做的唯一更改,我还需要做哪些其他更改才能使架构与模型匹配?

4

2 回答 2

1

告诉 EF 你要进行自动迁移

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, MyMigrationConfiguration>());
        Context.Database.Initialize(true);


public abstract class MyMigrationConfiguration<TContext> : DbMigrationsConfiguration<TContext> 
    where TContext  : DbContext{

    protected  MyMigrationConfiguration() {
        AutomaticMigrationsEnabled = true;  //<<<<<<<<<<<<<<<<<<<
        AutomaticMigrationDataLossAllowed = true; 

    }

编辑:根据反馈添加评论

更改数据库以匹配架构意味着如果迁移历史表不匹配,也需要更改它。手动设置模型数据二进制文件以匹配您的模型,这并不简单。如果您的表与您的代码匹配,那么作为最后一个模型记录在 __MigrationHistory 中的模型必须不同。你的问题就从那里开始。您可以从 MigrationHistory 表中删除所有条目并重试。[免责声明..复制条目...等]但是与EF作战并不是理想的方法。这也意味着您处于准 DB 优先模式。所以我建议你不要继续走这条路。除非您打算进入 DB First 模式。

您所说的是您不相信 EF 在代码优先的情况下会做正确的事情。
备份数据库。那就试试吧。如果 EF 做了“错误”的事情,我的建议是尝试处理。如果您遇到 EF 无法处理的令人讨厌的迁移场景,请提出一个新问题以获取解决方法。

在此处输入图像描述 在此处输入图像描述

于 2013-05-19T14:01:33.520 回答
0

对此的真正答案是 EF 中的一个错误。
在 Global.asax.cs 中需要这一行:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        //...

        // Weird fix before using any DbContext instance <--- THIS
        Database.SetInitializer<MyDbContext>(null);
    }
于 2014-04-24T16:38:27.580 回答