【问题标题】:Recommendations for: The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type [closed]建议:CLR 类型到 EDM 类型的映射不明确,因为多个 CLR 类型与 EDM 类型匹配 [关闭]
【发布时间】:2013-02-14 17:12:25
【问题描述】:

我有一个包含 100 多个 dables 的数据库。我决定将 EF 模型分成三个不同的模型。有多个表格出现在多个模型中。使用 EF 5.X DbContext Generator 后,我有了 POCO 类。

此模板生成重复的类(出现在多个模型中的类)但具有不同的命名空间。在尝试查询其中之一后,我收到以下错误:

The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type

遇到这个问题后,我相信我有两种选择:

  1. 编辑 CSDL、MSL、SSDL 文件以重命名实体。在这种情况下,我会将上下文名称作为前缀附加到实体。
  2. 编辑 EF 5.x DbContext 生成器以编辑将生成的 POCO 类的名称。在这种情况下,我还将上下文名称作为前缀附加到 POCO 类。

我的问题如下:我应该遵循哪个选项?以及根据选择的选项我需要做什么。如果没有一个选项是有效的,你建议我怎么做?

【问题讨论】:

  • 这个问题没有“最佳”答案。您必须找到最适合您需求的解决方案。您没有提到的另一种方法是修改生成器以不再创建已经存在的类。
  • 我知道这个问题没有具体的答案,但任何建议都会有所帮助。你知道我怎样才能编辑 DbContext 生成器模板,这样它就不会创建已经存在的类吗?我试图弄清楚,但完全无法理解模板背后的所有代码。

标签: c# entity-framework poco dbcontext edmx


【解决方案1】:

如果您编辑 t4 模板(选项 2),所有类都会受到影响。通过编辑类名(您可以在设计器界面中执行此操作),您可以仅更改在更多上下文中常见的那些类。

所以如果重叠的类很少,我会选择选项 1。我在类似的场景中做同样的事情,其中​​一些表包含在多个上下文(业务、授权、报告......)中,并且只有该类具有其原始名称的上下文用于该类的 CUD 操作。此外,我不希望我的所有课程都有前缀。

【讨论】:

  • 这个解决方案似乎真的很有用,但我还有另一个问题要面对。因为我将 db 模型拆分为三个不同的模型,所以我使用 csdl 文件中的“使用命名空间”来引用另一个模型的实体。有了这个我不能重命名实体的名称,因为它们不适合它们在其他模型中的名称。任何的想法? (因为性能问题,我拆分了模型,不知道这是否适用于 EF 5)
  • 这听起来像是你不应该做的事情。我们在同一条轨道上吗?我说的是业务上下文中的User 实体和授权上下文中的AuthorizationUser 实体。两者都映射到同一张表,但除此之外它们彼此无关。
  • 我理解你。就我而言,你建议我做什么?我已经被困了好几天没有找到任何解决方案。
  • 我会重命名几个通用类,让它们每个都有一个主上下文,在其他上下文中具有只读功能。
  • 在为这个问题寻找解决方案的过程中,我将每个模型放在不同的程序集中,这样就不会出现重复的类。进行此更改后,我收到此错误:DbContext 类不能与每种类型 (MEST) 具有多个实体集的模型一起使用。我需要退出使用 DbContext 和 POCO 吗?
【解决方案2】:

我删除了 .edmx 文件并重新创建了它。
这解决了问题。不确定这是否对您有帮助。

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多