对于EF 6和5,CLR类型到EDM类型的映射是不明确的?

Mah*_*mir 67 c# entity-framework entity-framework-4

请任何人帮我修复此错误?

指定的架构无效.错误:

CLR类型到EDM类型的映射是不明确的,因为多个CLR类型与EDM类型"City_DAL"匹配.之前发现CLR类型'CeossDAL.City_DAL',新发现的CLR类型'CeossBLL.City_DAL'.

我有DAL的主要问题,这包含EF和BLL,这包含相同的DAL类但名称空间不同,这就是导致问题的原因

我不知道怎么摆脱这些问题,能帮帮我吗?

如果有人给我示例使用带有EF的n层架构,我将不胜感激

谢谢

Lad*_*nka 76

不要使用具有相同非限定名称的类 - EF仅使用类名来标识EDMX中映射的类型(忽略名称空间) - 允许将来自不同名称空间的类映射到单个模型.您的问题的解决方案是以不同的方式命名您的BLL类.

  • 只有当两个类具有相同的名称和相同的参数集时,才会发生EF冲突. (9认同)
  • @Ladislav我会在没有SO帖子的情况下放弃EF.再次保存.谢谢. (4认同)
  • 当我使用3层(DAL/BLL/PL)项目时,我有两个类,所以我在DAL中有EF,并且我在BLL中有相同的EF类,在BLL中每个类包含使用的方法调用DAL中的方法和DAL中的这些方法需要诸如DAL中存在的类Product的对象,但我从BLL调用这些方法,所以当我将该对象传递给DAL方法时,我从Product创建一个对象存在于BLL中,此处引发异常. (3认同)
  • EF 不在两个类之间进行映射。它在图中的实体之间进行映射并查找具有相同名称的单个类。 (2认同)

Mat*_*att 38

解决方法:更改两个相同类之一的属性.

EF匹配类名和类属性.所以我刚刚更改了其中一个EF对象的属性名称,错误消失了.

正如@Entrodus评论其他一个答案:

只有当两个类具有相同的名称和相同的参数集时,才会发生EF冲突.

  • 对于我的钱,这是最好的答案 - 我宁愿搞砸一个属性名而不是一个类名 (7认同)
  • @ErikBergstedt如果在同一解决方案中使用两个程序集,则会开始收到错误. (5认同)
  • 在 EDMX 中的冲突实体中,我尝试更改其中一个属性的名称、添加另一个属性、添加具有更多“虚拟”属性的 Partial 类……它们都不起作用。只有更改实体的名称对我有用... (4认同)
  • 我只是将它们放在不同的组件中......不需要乱用它 (2认同)
  • 那是毫无意义的声明。类没有参数。 (2认同)

小智 10

MSDN论坛问题可能会有所帮助.它建议将BLL和DAL类放在单独的程序集中.

  • 如果您在相同的解决方案中使用两个程序集,将发生错误...我有完全相同的问题。两者都是不同的数据库,但是具有相同的`tblSetting`。我把它放在2个不同的程序集上(总是放在不同的程序集上),它不起作用:( (2认同)

Eku*_*kus 8

对于EF 6.x,我在https://github.com/aspnet/EntityFramework/issues/941上找到了一些注意事项,并通过在EDM类型中添加注释来解决这个问题.

我手动编辑了EDMX文件并更改了这样一行:

<EntityType Name="CartItem">
Run Code Online (Sandbox Code Playgroud)

对此:

<EntityType Name="CartItem" customannotation:ClrType="EntityModel.CartItem">
Run Code Online (Sandbox Code Playgroud)

或者使用您现有类型的其他地方:

<EntityType Name="CartItem" customannotation:ClrType="MyApp.CartItem, MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
Run Code Online (Sandbox Code Playgroud)

其中EntityModel是用于我的EF模型的命名空间,MyApp是业务对象的命名空间


Cap*_*chi 5

在某些情况下,这比实际问题更具症状。对我来说,当我尝试在Linq查询中调用一个函数而不先调用.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
});
Run Code Online (Sandbox Code Playgroud)

我必须调用.ToList(),然后遍历每个项目并为其分配类型。

  • 谢谢!这正是我的问题,在linq语句中转换为一个枚举。 (2认同)