我正在尝试使用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>();
但我仍然得到错误。
答案 0 :(得分:30)
嗯,感觉有点傻,但真正的罪魁祸首是声明:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());
似乎DropCreateDatabaseIfModelChanges
与Code First
方法不兼容,或者是我还不了解的另一个谜。
答案 1 :(得分:4)
删除IncludeMetadataConvention
表示初始化程序无法判断模型何时更改。将其添加回来也无济于事,因为它只在数据库创建时创建元数据表,对于预先存在的数据库或在禁用约定时创建的数据库,这显然不存在。
解决方案是删除数据库并启用约定,或者禁用初始化程序并以其他方式更新数据库(手动或ef迁移)
答案 2 :(得分: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应用程序,并且它运行良好。
即使在运行应用程序之前手动删除数据库也无法解决问题。
将“好”应用与“坏”应用进行比较,唯一的区别是网络服务器的选择。 “好”应用程序使用Visual Studio Development Server; “坏”使用了IIS Express。
我将“坏”应用程序切换到Visual Studio Development Server,错误消失了!
我现在没有时间深入研究“为什么”,但显然IIS Express正在缓存不正确的内容。