【发布时间】:2011-11-03 00:16:13
【问题描述】:
我有 2 个相关的实体,但旧版 sql 模式本质上对同一个表有 2 个键列(不是 2 列键:见下文)。我需要创建与“假键”列的关系。有没有办法在 Entity Framework 4.1 中以声明方式执行此操作?
Public Class Client
Inherits ModelBase
<Key(), Required()>
Public Property ClientID As Decimal
<Required(), StringLength(50)>
Public Property ClientCode As String
........
Public Class ClientLocation
Inherits ModelBase
........
<Required(), StringLength(50)>
Public Property ClientCode As String
........
<ForeignKey("ClientCode")>
Public Overridable Property Client As Clients.Client
我得到的错误是:
*在模型生成过程中检测到一个或多个验证错误: System.Data.Edm.EdmAssociationConstraint: : 所有的类型 引用约束的 Dependent Role 中的属性必须是 与 Principal Role 中的相应属性类型相同。 实体“ClientLocation”上的属性“ClientCode”类型不 匹配实体 'Client' 上的属性 'ClientID' 的类型 引用约束“ClientLocation_Client”。*
因为它认为我正在尝试映射 ClientLocation.ClientCode > Client.ClientID,而当我真正尝试映射 ClientLocation.ClientCode > Client.ClientCode.. .
有什么想法吗?
谢谢!
【问题讨论】:
-
"...遗留的 sql 模式本质上对同一个表有 2 个键列...":您的意思是
Client.ClientCode是一个具有唯一性的列数据库中的索引?或者什么是“2个键列......但不是复合键”?你想以某种方式将ClientLocation.Client映射到这个独特的列Client.ClientCode? -
表有2个有效key,但是第二个没有被识别为key,没有索引。例如,ClientID 可以是 4,ClientCode 可以是“FOGCREEK”。两者没有关联或依赖关系,它们只是碰巧都是独一无二的。是的,我需要使用 Client.ClientCode 映射回原始表,即使它没有在我的实体中标记为键。
-
啊,我明白了,那么
ClientCode就是一个普通的专栏。唯一性只是由业务逻辑意外确保的。恐怕拉迪拉夫的回答才是硬道理。
标签: .net vb.net entity-framework-4.1 vb.net-2010