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

时间:2014-12-18 19:03:49

标签: entity-framework entity-framework-6 foreign-key-relationship edmx unique-key

使用 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的关系约束中的主体角色引用的EntityType ExternalDataItem的键完全相同。确保在主体角色中指定了所有关键属性。

主要角色&#34; (?)对于ExternalDataItems SSDL看起来如下,对于PK,并且UX似乎不存在 2 ,除了作为简单的标量属性:

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

如何添加此关系 - 使用FK到非PK候选键?(在此之后&#34;工作&#34;我还希望也有导航属性到CSDL。)

此外,关联线没有出现在设计界面 - 我怀疑这只是因为这个错误而产生的影响。我正在使用Entity Framework版本6.1.1(最新发布在nuget上)和Visual Studio 2013 Ultimate Update 4。


1 标准的EDMX&#34;从数据库更新&#34;似乎没有拿起这些FK关系(may be related to this bug),上面的结果是在使用Huagati DBML / EDMX工具之后。如果我试图&#34;添加协会&#34;之前,设计人员会错误地尝试使用主键 - 任何FK关系都不支持 - 并且没有提供选择替代属性的选项。


2 尝试按"Unique Constraints in the Entity Framework"中所述添加<UniqueConstraint>元素会导致友好的XML验证错误:

  

元素&#39;元素类型&#39; ..具有无效的子元素&#39; UniqueConstraint&#39;。

1 个答案:

答案 0 :(得分:8)

看起来像"missing important feature"

  

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

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

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

您也可以使用这些连接的表创建VIEW并使用它。