Entity framework 4 EF 4代码优先:无法检查模型兼容性,因为模型中未包含元数据类型

Entity framework 4 EF 4代码优先:无法检查模型兼容性,因为模型中未包含元数据类型,entity-framework-4,ef-code-first,Entity Framework 4,Ef Code First,我正在尝试使用EF4代码优先模式。我的初始化代码如下: 创建模型生成器: private static DbModelBuilder CreateModelBuild() { var builder = new DbModelBuilder(); //add entity classes about 12 of them builder.Conventions.Remove<IncludeMetadataConvention>(); return

我正在尝试使用EF4代码优先模式。我的初始化代码如下:

创建模型生成器:

private static DbModelBuilder CreateModelBuild()
{
    var builder = new DbModelBuilder();

    //add entity classes about 12 of them

    builder.Conventions.Remove<IncludeMetadataConvention>();
    return builder;
}
当我第一次运行代码时,它就起作用了。但当第二次运行并尝试使用
context.add(myEntity)
添加对象时,我会遇到以下异常:

Model compatibility cannot be checked because the EdmMetadata type was not 
included in the model. Ensure that IncludeMetadataConvention has been added 
to the DbModelBuilder conventions.
我已尝试删除以下行:

builder.Conventions.Remove<IncludeMetadataConvention>();
builder.Conventions.Remove();

但我还是犯了错误。

感觉有点傻,但真正的罪魁祸首是以下陈述:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());
Database.SetInitializer(新的DropCreateDatabaseIfModelChanges());

似乎
DropCreateDatabaseIfModelChanges
code First
方法不兼容,或者这是我(还)不理解的另一个谜。

删除
IncludeMetadataConvention
意味着初始值设定项无法判断模型何时更改。将其添加回数据库也不会有帮助,因为它只会在创建数据库时创建元数据表,对于先前存在的数据库或在禁用约定的情况下创建的数据库,元数据表显然不存在


解决方案是删除数据库并启用约定,或者禁用初始值设定项并以另一种方式更新数据库(手动或ef迁移)

如果您在VS 2012中遇到此错误,并且正在使用IIS Express以调试模式运行,请尝试切换到Visual Studio Development Server

在一个代码优先的asp.net mvc 4应用程序中,我在Windows 7计算机上使用Visual Studio 2012,在本地主机上以调试模式运行SQL Server LocalDb(服务器,no*.mdf),遇到了相同的错误

我的初始值设定项被标记为DropCreateDatabaseIfModelChanges属性,我正在Global.ascx.cs应用程序_Start中调用Database.Initialize。如果数据库被删除并重新创建,它怎么会抱怨缺少迁移表呢?这尤其让人恼火,因为我用同样的方法建立了另一个web应用程序,它工作得非常完美

即使在运行应用程序之前手动删除数据库也无法解决问题

将“好”应用程序与“坏”应用程序进行比较,唯一的区别在于web服务器的选择。“好”应用程序使用Visual Studio开发服务器;“坏”使用了IIS Express

我将“坏”应用程序切换到Visual Studio Development Server,错误消失了


我现在没有时间深入探究“为什么”,但IIS Express显然缓存了不正确的内容。

它是兼容的。问题是,您第一次创建它时,它没有用于跟踪模型更改的表,因此它会抱怨。一旦EF第一次创建了数据库,您就可以将初始化策略更改回原来的状态。
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());