gpt4 book ai didi

c# - EF4 Poco 问题映射类型相同的名称相同的程序集不同的命名空间

转载 作者:IT王子 更新时间:2023-10-29 04:27:53 25 4
gpt4 key购买 nike

我遇到了 EF4Proxy Pocos 的问题。

我在同一个程序集中有 2 个同名但不同命名空间的类:

QuoteModels.CashPayment
OrderModels.CashPayment

这编译正常,但在运行时 EF 抛出以下异常:

Schema specified is not valid. Errors: \r\nThe mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'CashPayment'. Previously found CLR type 'QuoteModels.CashPayment', newly found CLR type 'OrderModels.CashPayment'

是否有一种变通方法可以让具有不同命名空间的同一程序集中具有相同名称的类与 Ef4 一起使用?

我是否必须给它们不同的名称或将它们移动到另一个程序集中?

最佳答案

我找到了解决方法。这是一个非常明显的非理想解决方法,但我认为在 EF5 出来解决这个问题之前,我认为它对我们来说已经足够好了。

简短回答:只需重命名一个或两个不明确的实体,例如:2x Person 重命名为:Personal_PersonWork_Person 基于 PersonalContextWorkContext

长答案:在我们的场景中,我们使用的是数据库优先的方法(我们正在重写旧版应用程序,对数据库的更改最少)。我们的数据库包含数百个表,因此我没有使用单个 EDMX/上下文,而是使用多个 EDMX/上下文(每次我尝试添加超过一半的表时,EDMX 都会发出声音)。但是,有些表需要存在于多个 EDMX/Context 中。

为了便于讨论,我们假设我们有一个包含以下表格的简单数据库:

  • 家庭
  • 关系
  • 地址
  • 商业
  • 员工

此外,为了便于讨论,我们假设存在于多个上下文中的任何表都会导致此问题(正如我在对 Devart 的回答的评论中所述,这不是真的,我不明白为什么它有时会起作用).

现在假设我们要创建两个上下文:

个人上下文:

  • 家庭
  • 关系
  • 地址

工作环境:

  • 商业
  • 地址
  • 员工

在这种情况下,PersonAddress 都会导致我们的问题。因此,我们将在 EDMX 映射中做的只是将我们的实体重命名为 Personal_Person/Work_PersonPersonal_Address/Work_Address .

如前所述,这是一个非常明显的非理想解决方法,但由于 EF 不考虑命名空间并严格按照名称(不是真实身份,只是名称)进行操作,因此一种选择是将你的名字里面的命名空间。

现在我仍在争论是否要这样做,或者为每个实体命名空间名称(Personal_PersonPersonal_FamilyPersonal_Relationship Personal_AddressWork_PersonWork_BusinessWork_AddressWork_Employee ) 对于一致性和 Intellisense 友好性(保持所有实体按正确的字母顺序排列)因为实际上,命名空间属于名称之前而不是之后,但这是一个判断调用,对于提供问题的解决方案并不重要。

希望对您有所帮助!!

关于c# - EF4 Poco 问题映射类型相同的名称相同的程序集不同的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3354137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com