在代码第一实体框架中手动编辑数据库

时间:2011-05-18 18:09:37

标签: entity-framework migration ef-code-first entity-framework-4.1 data-migration

我一直在尝试使用MVC 3的EF 4.1(代码优先)。我正在考虑应用程序何时需要更改。我测试了几个场景。我喜欢在模型(我的POCO)发生变化时手动编辑数据库的想法。

更改模型时出现ASP.NET错误:

“自创建数据库以来,支持'CTCMContext'上下文的模型已更改。手动删除/更新数据库......”

现在,它说我可以“手动更新数据库”,但是我做了并且仍然得到相同的错误。我错过了什么!!?!

修改

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

4 个答案:

答案 0 :(得分:9)

我也有过这方面的挣扎。我发现当你让EF为你创建数据库时,会创建一个名为dbo.EdmMetadata的表,这就是EF跟踪模型状态的地方/方式。我发现如果你在最初创建数据库后删除了这个表,你会把东西放到“手动模式”,你现在可以在这里手动添加/删除数据库中的列,表等,EF不会抛出你的错误正在看到。

如果您希望在更改模型时继续使用EF更新数据库,则需要创建并调用继承自DropCreateDatabaseIfModelChangesDropCreateDatabaseAlways的ContextInitializer类,具体取决于你想要发生的行为。

答案 1 :(得分:0)

正如我所看到的,对于代码优先的数据演变,实际上没有任何内置EF的方法。

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

更新: EF 5.0现在支持migrations

答案 2 :(得分:0)

使用新字段名更改类,删除表“EdmMetaData”,然后重新编译您的应用程序。

您将负责修改视图中的字段名称。

它对我有用。

答案 3 :(得分:0)

我知道这已被标记为已解决,但在我的情况下,它并没有成功。

删除dbo.EdmMetadata后,我收到了另一个错误:

Model compatibility cannot be checked because the database does not contain model metadata. Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions.

它对我有用的方法是从Initializer删除Application_Start课程:

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