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

The*_*iot 13 entity-framework-4 ef-code-first

我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

创建会话:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

我试过删除以下行:

builder.Conventions.Remove<IncludeMetadataConvention>();
Run Code Online (Sandbox Code Playgroud)

但我仍然得到错误.

The*_*iot 30

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

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());
Run Code Online (Sandbox Code Playgroud)

它似乎DropCreateDatabaseIfModelChangesCode First方法不兼容,或者是其他一些我还不了解的神秘事物.

  • 它是兼容的.问题是,第一次创建它时,它没有用于跟踪模型更改的表,因此它会抱怨.一旦数据库第一次由EF创建,您就可以将初始化策略更改回原来的状态. (22认同)