我并不担心回滚(即:Down()方法),并且希望始终使用最新的代码修改,因此我不使用代码迁移。
我改变了这个:
int SomeProperty {get; set;}
对此:
int? SomeProperty {get; set;}
然后我修改了数据库模式(将SomeProperty列改为允许NULLS)。
虽然这是最后一部分,但我仍然收到错误:
The model backing the <Database> context has changed ...
我需要做哪些其他更改才能使模式与模型匹配(如果int(对int?)是我做过的唯一更改?
答案 0 :(得分: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;
}
编辑:根据反馈添加评论
更改数据库以匹配架构意味着如果迁移历史记录表不匹配,也需要更改它。手动设置Model Data二进制文件以匹配您的模型,并不是直截了当的。 如果您的表与您的代码匹配,那么作为最后一个模型记录在__MigrationHistory中的模型必须是不同的。你的问题就在那里开始。 您可以从MigrationHistory表中删除所有条目,然后重试。 [免责声明..参加条目副本等等]但是打击EF不是理想的方法。 这也意味着您处于准数据库优先模式。所以我建议你不要继续这条路。除非您计划进入DB First模式。
你所说的是你不相信EF在代码优先的情况下做正确的事情 备份数据库。然后尝试一下。如果EF做了“错误”的事情尝试并处理这将是我的建议。如果您有一个令人讨厌的迁移方案EF无法处理,请启动一个新问题以获得解决方法。
答案 1 :(得分: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);
}