Ken*_*rdt 23 c# namespaces poco entity-framework-4
我遇到了EF4和Proxy Pocos的问题.
我在同一个程序集中有两个具有相同名称的类但名称空间不同:
QuoteModels.CashPayment
OrderModels.CashPayment
Run Code Online (Sandbox Code Playgroud)
这编译很好但在运行时EF抛出以下异常:
指定的架构无效.错误:\ r \n由于多个CLR类型与EDM类型"CashPayment"匹配,因此CLR类型到EDM类型的映射不明确.以前发现CLR类型'QuoteModels.CashPayment',新发现的CLR类型'OrderModels.CashPayment'
是否有一种解决方法可以在具有不同命名空间的同一程序集中使用具有相同名称的类来与Ef4一起使用?
我是否必须给他们不同的名字或将他们移到另一个集会?
Jax*_*ian 12
我找到了解决办法.这是一个非常明显的解决方案,这是非理想的,但我想我会把它称为足够好,直到EF5出来解决这个问题.
简答:只需重命名一个或两个ambigous实体就像:2x Person被重命名为:Personal_Person并且Work_Person基于a PersonalContext和a WorkContext.
长答案:在我们的场景中,我们使用的是DB-first方法(我们用最少的DB更改重写遗留应用程序).我们的数据库包含数百个表,因此我没有使用单个EDMX/Context,而是使用多个EDMX /上下文(每当我尝试添加超过一半的表时,EDMX就会出现问题).但是,某些表需要存在于多个EDMX/Context中.
为了讨论,我们假设我们有一个包含以下表格的简单数据库:
PersonFamilyRelationshipAddressBusinessEmployee另外,为了便于讨论,让我们假设存在于多个上下文中的任何表都会导致这个问题(正如我在Devart的回答中所说的那样,这不是真的,我不明白为什么它有时会起作用).
现在让我们说我们要创建两个上下文:
PersonalContext:
PersonFamilyRelationshipAddressWorkContext:
PersonBusinessAddressEmployee在这种情况下,无论是Person和Address会造成我们的问题.那么我们在EDMX映射中要做的就是将我们的实体重命名为Personal_Person/ Work_Person和Personal_Address/ Work_Address.
如上所述,这是一个非常明显的解决办法,这是非理想的,但由于EF不考虑名称空间并严格按名称(不是真实身份,只是名称),一个选项是将你的命名空间放在里面你的名字.
现在我还在争论,如果我要那样做,或者是为每个实体命名空间中的名称(Personal_Person,Personal_Family,Personal_Relationship,Personal_Address和Work_Person,Work_Business,Work_Address,和Work_Employee)的一致性和智能感知友好(保持所有实体在适当的字母顺序排列)实际上,命名空间属于名称之前而不是之后,但这是一个判断调用,对提供问题的解决方案并不重要.
我希望这有帮助!!
看看这篇文章。Derek的评论似乎涉及同样的问题,但他没有收到微软的任何答复。