2011-12-25 47 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將緩存不正確的東西。

相關問題