2010-02-28 69 views
36

我在使用Entity Framework 4.0 RC時遇到了異常。 我的實體框架模型封裝在一個名爲Procurement.EFDataProvider的私人程序集中,而我的POCO類在另一個程序集的內部Procurement.Core Core(業務邏輯)和EFDataProvider(數據訪問)之間的關係是一個名爲DataProvider的工廠無法找到EntityType錯誤的EF映射和元數​​據信息錯誤

所以當我嘗試創建一個對象集

objectSet = ObjectContext.CreateObjectSet<TEntity>(); 

我得到一個錯誤:

Mapping and metadata information could not be found for EntityType 'Procurement.Core.Entities.OrganizationChart'.

+2

今天早上我對此表示反對,我認爲最簡單的解決方案可能是使用POCO T4模板生成它們:http://blogs.msdn.com/b/adonet/archive/2010/01/ 25/walkthrough-poco-template-for-the-entity-framework.aspx經過大量的挖掘才發現了這一點,並且在我知道Google上找到它的時候並不是微不足道: -/ – Rup 2010-10-06 10:58:52

+0

@Rup:我已經下載並現在使用它。 – IAbstract 2011-04-30 14:02:10

回答

58

爲別人處理的錯誤,我認爲這是值得一提的是,我發現,造成這種(非常無益的)錯誤的一些情況:

  • 拼寫錯誤的性質(區分大小寫!)
  • 屬性在POCO類缺少POCO和實體型之間
  • 類型不匹配(例如,爲int的長代替)
  • 枚舉的POCO(EF沒有按根據我的理解,現在不支持枚舉)

可能還有其他原因。

HTH

+0

感謝這些指針 - 節省時間。 – Stuart 2011-01-17 14:46:16

+1

非常有幫助。在我的情況下,我已經添加了一個屬性到實體而不更新POCO類。 Thanks- – 2011-02-22 13:46:00

+0

對於任何想要嘗試POCO/T4的人來說,只需謹慎一點,如果需要在生成對象後對其進行更改,則必須在模板級別執行此操作。這種爲我殺死了,因爲我現在沒有時間弄清楚它。這只是一個供參考。否則,它是非常整潔。 – dyslexicanaboko 2012-08-28 21:46:59

12

這可能是因爲EF找不到嵌入映射信息。您的連接字符串中,你可能會碰到這樣的他:

metadata=res://*/Models.MyModels.csdl|...etc 

那*是一個通配符,告訴對象上下文,試圖找到,我想嵌入映射信息,掃描所有加載的程序集。如果程序集未加載,EF將無法找到它。

你需要做的是爲連接字符串提供更多關於映射信息嵌入位置的信息。在*更改爲你的映射代碼的特定組件名稱:

metadata=res://Procurement.EFDataProvider/Models.MyModels.csdl 

如果失敗了,找到大會,並直接使用它加載到您的ObjectContext:

ObjectContext.Metadataworkspace.LoadFromAssembly(); 
+0

這有幫助。在我的情況下,我已經重新命名了一個類,並且res字符串沒有反映出這個變化。 – 2015-04-03 19:45:23

1

只是檢查與財產拼寫模擬

2

的評論,因爲我已經不是EDMX文件的更多在同一個組件,進行正確使用自定義命名空間中我得到這個錯誤。

這是關於System.Data.Objects中的異常的說法。ObjectContext的

//例外:

// System.InvalidOperationException: 
    //  When the System.Data.Metadata.Edm.EntitySet from entitySetName 
    //  does not match the System.Data.Metadata.Edm.EntitySet of the object’s 
    //  System.Data.EntityKey. 
    // -or- 
    //  When the System.Data.Objects.ObjectContext.DefaultContainerName 
    //  property is not set on the System.Data.Objects.ObjectContext and 
    //  the name is not qualified as part of the entitySetName parameter. 
    // -or- 
    //  When the specified type belongs to more than one entity set. 
2

我也看到它時,在配置文件中沒有指定連接字符串。

1

可能還有其他原因。我也拉了我的頭髮一晚。

我發現解決方案中的參考文獻有些混亂。在我的項目中,edmx屬於名爲DataAccess.Dll的項目。但我從我的exe文件中沒有提到它。從我的EXE我有一個名爲Business.Dll的另一個項目的參考,這個項目有一個DataAccess.DLL的舊位置的參考。

做下面的測試,看看你是否有這樣的問題:

  1. 打開你的EXE項目的bin主任,並保持它可見。
  2. 構建解決方案。
  3. 第一個將要構建的項目是數據訪問項目,您可以在bin文件夾中看到當前時間爲修改日期。
  4. 在構建其他項目時,您將看到DataAccess項目的修改日期已更改爲舊的項目。

您需要檢查您的參考資料並確保它們引用您的dll的更新位置。

0

一個noob錯誤,但我有錯誤,當我的訪問數據庫是隻讀的用戶名和密碼。希望我的錯誤能幫助別人。

0

我有類似的問題。我已經爲使用POCO類的一個數據庫和我自己編寫的Context對象提供了一個EDMX文件。當我爲另一個數據庫添加第二個EDMX時,我使用了POCO T4模板,然後EDMX都沒有工作,並拋出了你提到的錯誤。爲了解決這個問題,我放棄了我的自定義POCO和上下文,只使用了T4模板,並且再次運行良好。

0

我有一個問題,我已經添加了一些列到表。

在Table Mappings中,我重命名了列名。

儘管我運行了「Transform All Templates」並重新構建了應用程序,但我仍然得到'<>的關聯元數據類型>包含以下未知屬性或字段<>'錯誤。

Domain.Poco.tt中此表的類是正確的,但我發現Domain.Poco.MetaData.tt中的相應class.Metadata.cs文件沒有更新,並且有新的列與原始名稱 - 不是我在Table Mapping中指定的新的。

解決方案?我剛剛刪除了違規的元數據類,並重新運行了「Transform All Templates」,並且正確地重新創建了正確的列/函數名稱。

0

在我的情況下,它基本上是同樣的問題,映射不完全符合預期。發生在我身上的是我從一個子類轉移到基類的「每個層次繼承表」中的屬性,並忘記更新模型。

我有自定義的POCO並通過複製EDMX文件到一個空白的新項目,並讓它自動生成的實體,然後把它們比作什麼,我已經在尋找差異幫助了我。

0

我的問題是我所編輯的T4模板排除名爲「msrepl_tran_version」複製領域。這導致數據庫不匹配可能導致此錯誤消息的生成的類。只要確保你的數據庫和類匹配。

2

另一個可能的問題是,如果您使用代碼優先和你的實體類型是在單獨的程序到上下文是定義定義,你還沒有添加任何自定義映射到OnModelCreating(DbModelBuild modelBuilder)方法,那麼EF似乎忽略了數據註釋。

解決方案:

添加modelBuilder.Entity<YourEntityType>();OnModelCreating(DbModelBuild modelBuilder)方法。

Related post

+0

您好,先生,您是英雄! – 2016-03-29 22:47:40