EF 4 Code First:无法检查模型兼容性,因为EdmMetadata类型未包含在模型中

问题描述 投票:13回答:3

我正在尝试使用EF 4 Code First模式。我的初始化代码如下:

创建模型构建器:

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

    //add entity classes about 12 of them

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

创建会话:

private bool BuildSqlServerSession(DbModelBuilder builder)
{
    var model =
    builder.Build(new SqlConnection(@"connection string"));
    var cm = model.Compile();
    var context = new LittlePOSContext(cm);
    var dbExists = context.Database.Exists();
    _session = new EFSession(context);
    return dbExists;
}

这在我第一次运行代码时有效。但是当第二次运行并尝试使用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>();

但我仍然得到错误。

entity-framework-4 ef-code-first
3个回答
30
投票

嗯,这感觉有点傻,但真正的罪魁祸首是声明:

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

似乎DropCreateDatabaseIfModelChangesCode First方法不兼容,或者它是我还不了解的其他一些谜。


4
投票

删除IncludeMetadataConvention意味着初始化程序无法判断模型何时更改。将其添加回来也无济于事,因为它只在数据库创建时创建元数据表,对于预先存在的数据库或在禁用约定时创建的数据库,这显然不存在。

解决方案是删除数据库并启用约定,或禁用初始化程序并以其他方式更新数据库(手动或ef迁移)


0
投票

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

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

我的初始化程序标有DropCreateDatabaseIfModelChanges属性,我在Global.ascx.cs Application_Start中调用Database.Initialize。如果数据库被删除并重新创建,那么它是如何抱怨丢失的迁移表?这尤其令人困惑,因为我使用相同的方法设置了另一个Web应用程序,并且它运行完美。

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

将“好”应用程序与“坏”应用程序进行比较,唯一的区别是Web服务器的选择。 “好”应用程序使用Visual Studio Development Server; “坏”使用IIS Express。

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

我现在没有时间深入研究“为什么”,但显然IIS Express正在缓存一些不正确的东西。

© www.soinside.com 2019 - 2024. All rights reserved.