我一直在尝试使用MVC 3的EF 4.1(代码优先)。我正在考虑应用程序何时需要更改。我测试了几个场景。我喜欢在模型(我的POCO)发生变化时手动编辑数据库的想法。
更改模型时出现ASP.NET错误:
“自创建数据库以来,支持'CTCMContext'上下文的模型已更改。手动删除/更新数据库......”
现在,它说我可以“手动更新数据库”,但是我做了并且仍然得到相同的错误。我错过了什么!!?!
修改
这是否与EF生成的模型哈希有关?
答案 0 :(得分:9)
我也有过这方面的挣扎。我发现当你让EF为你创建数据库时,会创建一个名为dbo.EdmMetadata的表,这就是EF跟踪模型状态的地方/方式。我发现如果你在最初创建数据库后删除了这个表,你会把东西放到“手动模式”,你现在可以在这里手动添加/删除数据库中的列,表等,EF不会抛出你的错误正在看到。
如果您希望在更改模型时继续使用EF更新数据库,则需要创建并调用继承自DropCreateDatabaseIfModelChanges或DropCreateDatabaseAlways的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());
}