如何将 EF6 关联添加到非主键的候选键/唯一键?

问题描述 投票:0回答:1

使用Schema First,我有一个数据库结构,如下

ExternalDataItems
---
edataitem_id   PK -- surrogate auto-increment - NOT for FK relation here
datahash       UX -- Candidate Key / Unique Index (binary(20))

ExternalMaps
---
emap_id        PK
ext_datahash   FK on ExternalDataItems.datahash - NOT referencing the surrogate PK

生成SSDL/CSDL后1有这个

    <Association Name="FK_ExtMaps_ExtDataItems">
      <End Multiplicity="1" Role="ExternalDataItems" Type="Store.ExternalDataItems" />
      <End Multiplicity="*" Role="ExternalMaps" Type="Store.ExternalMaps" />
      <ReferentialConstraint> <!-- error on this element -->
        <Principal Role="ExternalDataItems">
          <PropertyRef Name="datahash" />
        </Principal>
        <Dependent Role="ExternalMaps">
          <PropertyRef Name="ext_datahash" />
        </Dependent>
      </ReferentialConstraint>
    </Association>

这会在

<ReferentialConstraint>
元素上产生错误

运行转换:主体角色ExternalDataItems引用的属性必须与关系FK_ExtMaps_ExtDataItems的关系约束中主体角色引用的EntityTypeExternalDataItem的键完全相同。确保在主体角色中指定所有关键属性。

对于 PK,ExternalDataItems SSDL 的“主要角色”(?)如下所示,并且 UX 似乎不存在2,除了作为简单的标量属性:

  <EntityType Name="ExternalDataItems">
      <Key>
        <PropertyRef Name="edataitem_id" />
      </Key>
      ..
      <Property Name="datahash" Type="binary" MaxLength="20" Nullable="false" />
  </EntityType>

如何添加此关系 - 使用 FK 到非 PK 候选键?(在此“工作”之后,我还希望拥有 CSDL 的导航属性。)

此外,关联线没有出现在设计表面中 - 我怀疑这只是此错误的后果。我正在使用实体框架版本 6.1.1(最新发布在 nuget 上)和 Visual Studio 2013 Ultimate Update 4。


1标准 EDMX“从数据库更新”似乎没有获取这些 FK 关系(这可能与此错误相关),上面的结果是使用 Huagati DBML/EDMX 工具后的结果。如果我之前尝试“添加关联”,设计器会错误地尝试使用主键(任何 FK 关系都不支持该主键),并且不会提供用于选择替代属性的选项。


2尝试添加

<UniqueConstraint>
元素(如“实体框架中的唯一约束”中所述)会导致友好的 XML 验证错误:

元素“ElementType”..具有无效的子元素“UniqueConstraint”。

entity-framework entity-framework-6 foreign-key-relationship edmx unique-key
1个回答
7
投票

看起来像“缺少重要功能”

.. 实体框架当前仅支持基于主键的引用约束,并且没有唯一约束的概念

您可以删除数据库方案中的外键并使用 LINQ 连接表:

from item in ExternalDataItems
join map in ExternalMaps on item.datahash = map.ext_datahash
select new { item.edataitem_id, map.emap_id };

您还可以使用这些连接表创建视图并使用该视图。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.