2013-02-17 90 views
52

請任何人都可以幫助我解決這個錯誤?CLR類型到EDM類型的映射與EF 6和5不一致嗎?

Schema specified is not valid. Errors:

The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'City_DAL'. Previously found CLR type 'CeossDAL.City_DAL', newly found CLR type 'CeossBLL.City_DAL'.

主要的問題,我有DAL,這包含了EF和BLL,這包含DAL的同一類,但在命名空間不同,這是導致該問題

我不能知道如何擺脫這些問題,你能幫我嗎?

此外,如果有人給我品嚐到用n層體系結構與EF

謝謝

我可以理解

回答

64

不要使用類具有相同不合格名字 - EF只使用類名稱來標識在EDMX中映射的類型(名稱空間被忽略) - 這是一個約定,允許將不同名稱空間的類映射到單一模型。你的問題的解決方案是用BLL命名你的類。

+0

如果我以不同的方式命名BLL中的類,EF如何在DAL和BLL中的類名之間進行映射? – 2013-02-20 12:21:13

+0

EF不在兩個類之間映射。它映射圖中的實體並查找具有相同名稱的單個類。 – 2013-02-20 12:34:09

+0

好吧,我使用代碼優先模型,現在如果我在BLL中創建了一個名爲Product_BLL的類,並且在EF中DAL中具有相同的類並且它的名稱是Product_DAL,現在當我想要添加一個實體這個類到數據庫,EF會等待我從Product_DAL類傳遞一個對象而不是Product_BLL?這是正確的還是我誤解了?非常感謝你的幫助 – 2013-02-20 14:46:52

11

This MSDN論壇的問題可能會有幫助。它建議將BLL和DAL類放在單獨的程序集中。

-6

有一個名爲AutoMapper的庫,您可以下載它。它可以幫助您定義從一種類到另一種類的類映射。

Mapper.CreateMap<Model.FileHistoryEFModel, DataTypes.FileHistory>(); 
Mapper.CreateMap<DataTypes.FileHistory, Model.FileHistoryEFModel>(); 
+0

沒有downvote的原因信息。 – pkamathk 2015-10-01 02:19:35

+8

不是真的適用於用戶的問題。使用automapper不會解決他的問題。 – Calvin 2015-10-13 14:33:37

24

解決方法:更改兩個相同類之一的屬性。

EF匹配類名稱和類屬性。所以我只是改變了其中一個EF對象的屬性名稱,並且錯誤消失了。

由於@Entrodus評論其他答案之一:

EF collision happens only when two classes have the same name AND the same set of parameters.

+5

對於我的錢,這是最好的答案 - 我寧願把一個屬性名稱弄得比一個類名稱 – OutstandingBill 2016-06-23 00:55:53

+1

我只是把它們放在不同的程序集中。無需贅述 – 2017-03-10 15:15:21

+0

@ErikBergstedt如果您在同一個解決方案中使用兩個程序集,您將開始出現錯誤。 – Tundey 2018-01-12 13:17:52

0

這可能不是已經面世時,有人問,但另一種解決方案是刪除EDMX並重新創建它作爲一個代碼優先實體數據模型。在EF6中,在代碼優先的情況下,您可以映射來自不同模型名稱空間的具有相同名稱的兩個類,而不會產生衝突。

要在Visual Studio(2013)中創建實體數據模型,請轉到「添加」>「新建項目...」>「ADO.NET實體數據模型」。一定要選擇「Code First from database」選項。

+0

這並不適用於我(試用EF 6.0和6.3),使用SQLite數據庫 – 2017-11-06 08:32:11

+0

我不知道它是否有所作爲,但是當我這樣做時,我在MS SQL Server上。 – 2017-11-06 21:04:44

0

在某些情況下,這是比實際問題更多的症狀。對我而言,當我嘗試在Linq查詢中調用一個函數而不先調用.ToList()時,它通常會彈出。

E.g.這使我在這裏的錯誤是造成的,因爲我這樣做:

var vehicles = DB.Vehicles.Select(x => new QuickSearchResult() 
{ 
    BodyText = x.Make + " " + x.Model + "<br/>" 
    + "VIN: " + x.VIN + "<br/>" 
    + "Reg: " + x.RegistrationNumber +"<br/>" 
    + x.AdditionalInfo 
    type = QuickSearchResultType.Vehicle,//HERE. Can't use an enum in an IQueryable. 
    UniqueId = x.VehicleID 
}); 

我不得不打電話.ToList(),然後通過每個項目迭代和分配的類型吧。

4

對於EF 6.x,我在https://github.com/aspnet/EntityFramework/issues/941處發現了一些注意事項,並在我的解決方案中通過向EDM類型添加了註釋來解決此問題。

我編輯的EDMX文件中手動,改變了這樣一行:

<EntityType Name="CartItem"> 

這樣:

<EntityType Name="CartItem" customannotation:ClrType="EntityModel.CartItem"> 

使用這個,如果你有現有類型的其它地方:

<EntityType Name="CartItem" customannotation:ClrType="MyApp.CartItem, MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 

哪裏EntityModel是用於我的EF模型的命名空間,並MyApp的是一個業務對象

+0

這不適合我(試用EF 6.0和6.3),使用SQLite數據庫 – 2017-11-06 08:31:50

+0

:-(我只用它與MSSQL – Ekus 2017-11-06 17:16:46

0

另一個原因你可能會得到這個錯誤的命名空間:如果您加載自定義組件與Assembly.LoadFile 那有已經加載到內存中的edmx文件。這會創建實體框架不喜歡的重複類。

0

我上面,因爲這兩種連接字符串,我不得不爲我的主要項目的配置文件中指定的元數據的值相同,如下面的錯誤:

<add name="EntitiesA" connectionString="metadata=res://*/EntitiesA.csdl|res://*/EntitiesA.ssdl|res://*/EntitiesA.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

<add name="EntitiesB" connectionString="metadata=res://*/EntitiesA.csdl|res://*/EntitiesA.ssdl|res://*/EntitiesA.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

我結束了複製從正確的連接字符串EntitiesB的項目配置文件。

相關問題