EF 4 Code First:无法检查模型兼容性,因为EdmMetadata类型未包含在模型中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF 4 Code First:无法检查模型兼容性,因为EdmMetadata类型未包含在模型中相关的知识,希望对你有一定的参考价值。
我正在尝试使用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>();
但我仍然得到错误。
嗯,这感觉有点傻,但真正的罪魁祸首是声明:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());
似乎DropCreateDatabaseIfModelChanges
与Code First
方法不兼容,或者它是我还不了解的其他一些谜。
删除IncludeMetadataConvention
意味着初始化程序无法判断模型何时更改。将其添加回来也无济于事,因为它只在数据库创建时创建元数据表,对于预先存在的数据库或在禁用约定时创建的数据库,这显然不存在。
解决方案是删除数据库并启用约定,或禁用初始化程序并以其他方式更新数据库(手动或ef迁移)
如果您在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正在缓存一些不正确的东西。
以上是关于EF 4 Code First:无法检查模型兼容性,因为EdmMetadata类型未包含在模型中的主要内容,如果未能解决你的问题,请参考以下文章
使用EF 4.1 Fluent Code First的每类型表继承
ef4.4 code first数据库新增时 初始化表数据不成功
如何使用 Code-First EF 4.1 从数据库中删除多个项目