繁体   English   中英

如何在实体框架中忽略组合键的一部分

[英]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具有复合密钥,并且PersonProject之间没有关联。 现在,我们将通过以下步骤欺骗EF:

  • 从主键中删除Person.name :右键单击Name,然后取消选中“ Entity Key”。

  • PersonProject之间添加关联:右键单击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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM