使用Code First Entity Framework手动编辑数据库

12

我一直在尝试使用MVC 3中的EF 4.1(code first)。考虑到应用程序将需要更改,我测试了几种场景。我喜欢在模型(我的POCOs)更改时手动编辑数据库的想法。

当我更改模型时,ASP.NET报错:

"The model backing the 'CTCMContext' context has changed since the database was created. Either manually delete/update the database..."

现在,它说我可以 "手动更新数据库",但是我已经尝试了更新,仍然收到相同的错误。 我错过了什么吗!?!

编辑

这是否与EF生成的模型哈希有关?

4个回答

9
我也遇到了这个问题。当你让EF为你创建数据库时,它会创建一个名为dbo.EdmMetadata的表,这就是EF跟踪模型状态的方式和位置。如果在数据库被初始化创建后删除此表,你将进入“手动模式”,现在可以手动添加/删除列、表等到你的数据库中,EF不会抛出你所看到的错误。
但是,如果你想让EF在你对模型进行更改时继续更新你的数据库,你需要创建并调用一个ContextInitializer类,该类继承自DropCreateDatabaseIfModelChangesDropCreateDatabaseAlways,具体取决于你想要发生的行为。

感谢您的技巧。关于您回答的第二部分,您可能会对这个感兴趣: https://dev59.com/mW865IYBdhLWcg3wA5yc我目前正在阅读它,我可能会尝试一下。 - billy

0

我知道这个问题已经被标记为已解决,但在我的情况下它并没有起作用。

一旦我删除了 dbo.EdmMetadata,我就会得到一个不同的错误:

无法检查模型兼容性,因为数据库不包含模型元数据。请确保已将 IncludeMetadataConvention 添加到 DbModelBuilder 约定中。

对我有用的方法是从 Application_Start 中删除 Initializer 类:

void Application_Start(object sender, EventArgs e)
{
    // MyDB.SetInitializer<MyContext>(new MyInitializer());
}

0

据我所见,EF 中没有为 Code First 数据演化构建的方法。

对于我的最初问题,答案在于移除模式生成/验证。只有这样手动编辑代码和数据库才能起作用。

更新: EF 5.0 现在支持 迁移


0

修改类名并更新字段名称,删除"EdmMetaData"表后重新编译你的应用程序。

你需要负责修改视图中相关的字段名称。

对我来说这个方法可行。


1
我猜我可以这样做,但我必须修改数据库和元数据表...我的答案只涉及修改数据库(在删除元数据表之后)... - billy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接