我遇到了 EF4 和代理Pocos 的问题。
我在同一个程序集中有2个具有相同名称的类但不同的名称空间:
QuoteModels.CashPayment
OrderModels.CashPayment
这编译很好,但在运行时EF抛出以下异常:
指定的架构无效。错误: \ r \ n将CLR类型映射到EDM 类型是不明确的,因为多个CLR 类型与EDM类型匹配 '现金支付'。以前发现过CLR 新输入'QuoteModels.CashPayment' 找到了CLR类型 'OrderModels.CashPayment'
是否有一种解决方法可以在具有不同命名空间的同一程序集中使用具有相同名称的类来使用Ef4?
我是否必须给他们不同的名字或将他们移到另一个集会?
答案 0 :(得分:12)
我找到了解决办法。这是一个非常明显的解决方案,这是不理想的,但我想我会把它称为足够好,直到EF5出来解决这个问题。
简答:只需重命名一个或两个暧昧实体,例如:2x Person
根据{{Personal_Person
重命名为Work_Person
和PersonalContext
1}}和WorkContext
。
长答案:在我们的场景中,我们使用的是数据库优先方法(我们用最少的数据库更改重写遗留应用程序)。我们的数据库包含数百个表,因此我没有使用单个EDMX / Context,而是使用多个EDMX /上下文(每当我尝试添加超过一半的表时,EDMX就会出现问题)。但是,某些表需要存在于多个EDMX / Context中。
为了讨论,我们假设我们有一个包含以下表格的简单数据库:
Person
Family
Relationship
Address
Business
Employee
另外,为了讨论这个问题,让我们假设存在于多个上下文中的任何表都会导致这个问题(正如我在Devart的回答中所说,这不是真的,我不明白为什么它有时会起作用)。
现在假设我们要创建两个上下文:
PersonalContext
:
Person
Family
Relationship
Address
WorkContext
:
Person
Business
Address
Employee
在这种情况下,Person
和Address
都会导致我们的问题。因此,我们在EDMX映射中要做的只是将我们的实体重命名为Personal_Person
/ Work_Person
和Personal_Address
/ Work_Address
。
如上所述,这是非常明显的解决方案,这是非理想的,但由于EF不考虑名称空间并严格按名称(不是真实身份,只是名称),一个选项是放你名字中的名字空间。
现在我仍在辩论,如果我要这样做,或者为每个实体命名名称(Personal_Person
,Personal_Family
,Personal_Relationship
,{{1} {} {} {}} {}} {}} {}}这个名称而不是之后的名字,但这是一个判断号召,对解决问题并不是非常重要。
我希望这会有所帮助!!
答案 1 :(得分:3)
看看this post。 Derek的评论似乎处理了同样的问题,他没有得到微软的任何答复。
答案 2 :(得分:0)
我遇到了类似的问题。我花了一段时间来确定模式,但在我的背景下,当我有两个模型都有两个相同的实体时出现了问题。
在我的一个模型中,我有以下实体(“ - >”表示与方向的关系):
Users -> Authentication -> Authorization
(用户经过身份验证然后获得授权)。
另一方面我有这些实体:
Authentication -> Authorization -> InvoiceGeneration
(经过身份验证和授权的用户生成发票)。
在使用这两个模型运行我的应用程序时,我得到了与原始海报相同的错误。
事实证明,当我从第二个模型中移除Authentication
实体时,我的问题消失了,因此似乎 EDM到CLR映射器无法应对具有相同类型的实体“父母”关系(在我的两个模型Authorization
上都是Authentication
“之前”。
抱歉非科学关系描述:)