使用EF4的POCO模板時“找不到元數據信息”?

efpocoadapter entity-framework poco

我剛安裝了EF4的POCO模板。我的模型中有一個實體, AnnouncementText ,並且T4文件似乎正確生成。當我訪問自動生成的屬性MyObjectContext.AnnouncementTexts時,嘗試訪問此新實體會引發以下錯誤:

InvalidOperationException:無法找到EntityType'MyNamespace.AnnouncementText'的映射和元數據信息。

AnnouncementText POCO上的屬性似乎與數據庫中的列匹配,並且我沒有更改任何自動生成的代碼。

堆棧跟踪是:

   at System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType)
   at System.Data.Objects.ObjectContext.GetEntitySetForNameAndType(String entitySetName, Type entityCLRType, String exceptionParameterName)
   at System.Data.Objects.ObjectContext.CreateObjectSet[TEntity](String entitySetName)
   at MyNamespace.MyObjectContext.get_AnnouncementTexts() in C:\<snip>\MyObjectContext.Context.cs:line 65
   at MyNamespace.Class1.Main() in C:\<snip>\Class1.cs:line 14

如果我從解決方案中刪除.tt文件並在模型上啟用代碼生成,我可以毫無問題地訪問該屬性。

這是我的代碼,如果可能有幫助:

using (var context = new MyObjectContext())
   foreach (var at in context.AnnouncementTexts)
      Console.WriteLine(at.Title);

關於可能出錯的任何想法?

一般承認的答案

我最近在將EDMX文件移動到解決方案中的新位置時再次遇到了同樣的錯誤。顯然,處理EDMX文件時有幾個不同的命名空間。在創建初始EDMX文件(N1)時,通過嚮導輸入了命名空間,SSDL中顯示的另一個文件看起來像這樣(N2):

<Schema Namespace="..." ..

然後是生成代碼的命名空間,可以(可選)在設計器(N3)中指定,最後是編譯到最終程序集(N4)中的資源的隱藏名稱空間。

據我所知,命名空間N2只與SSDL內部真正相關。我相信這個命名空間以N1開始 - 你最初在嚮導中輸入的那個。

類似地,名稱空間N3僅與C#名稱空間的方式相關。

這是有問題的部分。類別N4名稱空間是EDMX所在目錄的功能(相對於項目目錄)。你可能會想,那又怎樣?事實證明,這些命名空間也在App.config文件中引用!具體來說,找一個像這樣的部分:

connectionString="metadata=res://*/Database.Master.csdl|...

讀取“Database.Master.csdl”的部分是您的CSDL資源的名稱。如果這些資源名稱不同步,您將收到類似上面的錯誤,或者可能:

在映射和元數據信息中找不到指定的默認EntityContainer名稱“[name]”。

簡單的解決方案是更改App.config,為EF映射的每個部分(CSDL,SSDL和MSL)指定正確的資源名稱。如果您不確定這些名稱是什麼,請在ILSpydotPeek中查看已編譯程序集的資源。


熱門答案

如果將EDMX文件複製到另一個項目,則“構建操作”(在“屬性”窗格中)將恢復為目標項目中的默認值“無”,這可能導致“無法找到”EntityContainer名稱...“錯誤,這是因為沒有生成資源。 (如果是這種情況,當您在Reflector中打開包含模型的DLL時,將沒有資源。)將Build Action設置為“EntityDeploy”並重建解決方案將糾正此問題。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因