2011-12-25 50 views
13

我试图使用EF 4代码优先模式。我的初始化代码如下:EF 4代码优先:模型兼容性无法检查,因为EdmMetadata类型未包含在模型中

创建模型创建:

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>(); 

,但我仍然得到错误。

回答

30

好,感觉有点愚蠢,但真正的罪魁祸首是以下语句:

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

似乎DropCreateDatabaseIfModelChanges不符合Code First方法兼容,或者是一些其他的mystry,我不明白,(还)。

+22

它是兼容的。问题是,第一次创建它时,它没有用于跟踪模型更改的表格,因此它会抱怨。一旦数据库第一次由EF创建,您可以将初始化策略改回原来的状态。 – 2012-04-21 14:05:32

4

删除IncludeMetadataConvention表示初始化程序无法知道模型何时更改。重新添加它也不会有帮助,因为它只创建数据库创建的元数据表,对于预先创建的数据库或使用禁用约定创建的数据库显然不存在。

解决方法是删除了数据库,并实现该公约,或禁用初始化和更新数据库的另一种方式(手动或EF迁移)

0

如果你是在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 Development Server,错误消失!

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

相关问题