[英]How to ignore part of a composite key in Entity Framework
我的任务是创建一个Windows服务,该服务将数据从一个数据库转换和迁移到另一个数据库。 我要提取的数据库是由我们的一个子部门开发的,在该数据库的结构中我没有任何发言权。
我的问题是,我要提取的数据库存在一些固有的缺陷,无法解决。 最大的问题是,在许多表上,主键都设置为组合主键...这不是什么大问题,但是应该关联的其他表仅包含组合的一部分参考的关键。
例如,“人”具有ID和姓氏作为复合键。 ID是代理自动增量整数键,Surname是varchar。 仅ID列就足以唯一地标识一个人,但是由于某些原因,他们还在组合密钥中包括了姓氏。 “ Project”应该引用“ People”以表示该项目分配给了谁...但是“ Project”只是具有“ PersonID”,而不是姓氏。
我正在查看他们的数据库和Access前端,并且在两者之间没有定义任何实际的关系....只是通过它们的前端进行逻辑维护。
因此,如果我要加入的表没有其他表的复合主键指定的所有列,该如何添加自己的导航属性? 从技术上讲,我有ID号,这是我在逻辑上进行关联所需要的,但是实体框架要求所有组合键列都映射在引用约束中。
我可以忽略导航属性,而让我的程序添加逻辑来解决这些空白,但是延迟加载意味着我将不得不分阶段构建查询。
如果复合键的某列对表的标识无意义,是否可以忽略该键?
编辑
我还应该指出,我永远不会写他们的数据库。 我将只查询他们的数据。 与我连接的用户帐户仅被授予选择权限。
EF不必了解复合键。 如果您确定某列是唯一的,则可以欺骗EF并仅将重要的关键字段告知它。 但是,这需要一些工作。
当您使用现有数据库时,我认为数据库优先方法将最适合您。 即使这样,仍有很多工作要做,但是我认为在EDMX图中,这比手动键入代码要容易。
如果您从数据库中生成模型,您会注意到的第一件事是EF不会在EDMX中生成所有关联。 这是因为EF仅生成涉及数据库中整个密钥(而密钥除外)的关联。
让我展示一下,这是基于您的示例的高度简化的数据模型。 从此数据模型生成EDMX模型后,该图如下所示:
尽管FK在数据库中,但Person
具有复合密钥,并且Person
和Project
之间没有关联。 现在,我们将通过以下步骤欺骗EF:
从主键中删除Person.name
:右键单击Name,然后取消选中“ Entity Key”。
在Person
和Project
之间添加关联:右键单击Person
,选择Add New,Association ...,填写对话框,如下所示:
请注意,未选中“添加外键属性...”。 如果是这样,EF将添加一个新的PersonId1
字段。
手动定义外键:右键单击关联,然后选择“属性”。
在“属性”窗格中,单击“引用约束”右侧的省略号。
填写对话框:
现在该图应如下所示:
完成!
要么...? 当您构建项目或验证图时,您将看到一个错误出现:
错误3003:映射片段的问题从第74行开始:EntitySet People的所有键属性(People.Id)必须映射到表Person的所有键属性(Person.Id,Person.Name)。
EF不那么容易上当。 我们修改了概念模型。 不是商店模型。 EF仍然知道Person
在数据库中有一个组合键。 我们该如何解决? 不幸的是(或幸运的是?)EDMX设计器对此没有支持。 我们必须编辑XML。
XML的第一部分包含SSDL content
,即存储架构定义。 查找Person
的商店定义,该定义应类似于以下内容:
<EntityType Name="Person">
<Key>
<PropertyRef Name="Id" />
<PropertyRef Name="Name" />
</Key>
<Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="Name" Type="nvarchar" MaxLength="50" Nullable="false" />
</EntityType>
删除线
<PropertyRef Name="Name" />
现在欺骗完成了,EF高兴了,模型验证了。
我必须承认我不喜欢这最后一部分。 无论您以哪种方式观看,它都是一种hack。 而且,当您从数据库更新模型时,商店模型中所有这些仔细应用的修改都消失了。
如果您先进行代码工作,就不会有此问题。 您可以使用Entity Framework Power Tools或VS2013中新集成的“添加新模型”对话框从数据库中重新设计模型,然后手动添加所有关联并删除所有冗余键。 我认为这还有很多工作要做,但至少是“更新安全的”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.