【问题标题】:EF 4 Code First: Model compatibility cannot be checked because the EdmMetadata type was not included in the modelEF 4 Code First:无法检查模型兼容性,因为模型中未包含 EdmMetadata 类型
【发布时间】:2011-12-25 17:57:02
【问题描述】:

我正在尝试使用 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


    【解决方案1】:

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

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

    似乎DropCreateDatabaseIfModelChangesCode First 方法不兼容,或者这是我不理解的其他一些谜团。

    【讨论】:

    • 兼容。问题是您第一次创建它时,它没有用于跟踪模型更改的表,因此它会抱怨。 EF 第一次创建数据库后,您可以将初始化策略更改回原来的样子。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      我的初始化程序用 DropCreateDatabaseIfModelChanges 属性标记,我在 Global.ascx.cs Application_Start 中调用 Database.Initialize。如果数据库被删除并重新创建,它怎么会抱怨缺少迁移表?这尤其令人恼火,因为我使用相同的方法设置了另一个 Web 应用程序并且它运行良好。

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

      比较“好”应用和“坏”应用,唯一的区别是网络服务器的选择。 “好”的应用程序使用了 Visual Studio 开发服务器; “坏”使用了 IIS Express。

      我将“坏”应用切换到 Visual Studio 开发服务器,错误消失了!

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

      【讨论】:

        猜你喜欢
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多