EF 6&5的CLRtypes到EDMtypes的映射是不明确的?
请任何人可以帮助我解决这个错误?
指定的模式无效。 错误:
CLRtypes到EDMtypes的映射是不明确的,因为多个CLRtypes与EDMtypes“City_DAL”相匹配。 以前发现CLRtypes“CeossDAL.City_DAL”,新发现CLRtypes“CeossBLL.City_DAL”。
我有DAL和这个主要问题包含EF和BLL,这包含相同的DAL类,但在命名空间不同,这是什么原因造成的问题
我不知道如何摆脱这些问题,你能帮我吗?
另外,如果有人给我示例使用EF的n层架构,我将不胜感激
谢谢
不要使用具有相同非限定名称的类 – EF只使用类名来标识在EDMX中映射的types(名称空间被忽略) – 允许将来自不同名称空间的类映射到单一模型的约定。 你的问题的解决scheme是以不同的BLL命名你的类。
解决方法:更改两个相同类之一的属性。
EF匹配类名称和类属性。 所以我只是改变了其中一个EF对象的属性名称,错误消失了。
正如@Entrodus评论其他答案之一:
只有当两个类具有相同的名称和相同的一组参数时才会发生EF冲突。
此 MSDN论坛问题可能会有所帮助。 它build议将BLL和DAL类放在单独的程序集中。
对于EF 6.x,我在https://github.com/aspnet/EntityFramework/issues/941上find了一些注释,并在我的解决scheme中通过向EDMtypes添加了注释来解决这个问题。;
我手动编辑了EDMX文件,并改变了这样一行:
<EntityType Name="CartItem">
对此:
<EntityType Name="CartItem" customannotation:ClrType="EntityModel.CartItem">
或者在其他地方使用现有types的情况下使用它
<EntityType Name="CartItem" customannotation:ClrType="MyApp.CartItem, MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
其中EntityModel是用于我的EF模型的名称空间, MyApp是业务对象的名称空间
当问题被问到时,这可能是不可用的,但另一种解决scheme是删除EDMX并将其重新创build为代码优先的实体数据模型。 在EF6中,在代码优先的情况下,可以从不同的模型命名空间中映射具有相同名称的两个类,而不会产生冲突。
要在Visual Studio(2013)中创build实体数据模型,请转到“添加”>“新build项目…”>“ADO.NET实体数据模型”。 一定要select“Code First from database”选项。
在某些情况下,这是比实际问题更多的症状。 对我来说,当我尝试在Linq查询中调用函数时,通常会popup,而不先调用.ToList()。
例如,我在这里带来的错误是由于我这样做的:
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(),然后遍历每个项目,并分配给它的types。
有一个名为AutoMapper的库,你可以下载。 它可以帮助您定义从一种类到另一种类的映射。
Mapper.CreateMap<Model.FileHistoryEFModel, DataTypes.FileHistory>(); Mapper.CreateMap<DataTypes.FileHistory, Model.FileHistoryEFModel>();