实体框架:0..1 对多外键约束无法识别?

Posted

技术标签:

【中文标题】实体框架:0..1 对多外键约束无法识别?【英文标题】:Entity Framework: 0..1-to-many foreign key constraint not recognized? 【发布时间】:2011-02-23 19:23:30 【问题描述】:

我正在使用 EF4 将数据库模式映射到对象模型;我最初从数据库生成了 EDMX,但一直在直接编辑 XML(试图在更改 CSDL/MSL 以接近我想要的对象模型时保持 SSDL 不变)。除其他外,该数据库包含一对表,它们通过外键具有 (0..)1 对多约束,如下所示:

go
create table Options (
    KitNodeID int primary key foreign key references KitNodes (KitNodeID),
    [SKUID] int null foreign key (SKUID) references SKUs (SKUID)
)
go
create table Upgrades (
    UpgradeID int identity (1, 1) primary key not null,
    [Name] nvarchar(50) not null,
    DefaultOptionID int null references Options (KitNodeID)
)

EDMX 中的相关部分如下所示:

[...]

<!-- SSDL content -->
        <edmx:StorageModels>
        <Schema Namespace="DModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
            <EntityContainer Name="DModelStoreContainer">

      <AssociationSet Name="FK__Upgrades__Defaul__70DDC3D8" Association="DModel.Store.FK__Upgrades__Defaul__70DDC3D8">
        <End Role="Options" EntitySet="Options" />
        <End Role="Upgrades" EntitySet="Upgrades" />
      </AssociationSet>
</EntityContainer>
    <EntityType Name="Upgrades">
      <Key>
        <PropertyRef Name="UpgradeID" />
      </Key>
      <Property Name="UpgradeID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="50" />
      <Property Name="DefaultOptionID" Type="int" />
    </EntityType>
<Association Name="FK__Upgrades__Defaul__70DDC3D8">
          <End Role="Options" Type="DModel.Store.Options" Multiplicity="0..1" />
          <End Role="Upgrades" Type="DModel.Store.Upgrades" Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="Options">
              <PropertyRef Name="KitNodeID" />
            </Principal>
            <Dependent Role="Upgrades">
              <PropertyRef Name="DefaultOptionID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
</Schema></edmx:StorageModels>

<!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema Namespace="DModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
        <EntityContainer Name="DEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="Upgrades" EntityType="DModel.Upgrade" />
          <AssociationSet Name="Upgrade_DefaultOption" Association="DModel.Upgrade_DefaultOption">
            <End Role="Options" EntitySet="Options" />
            <End Role="Upgrades" EntitySet="Upgrades" />
          </AssociationSet>
</EntityContainer>
  <Association Name="Upgrade_DefaultOption">
          <End Role="Options" Type="DModel.Option" Multiplicity="0..1" />
          <End Role="Upgrades" Type="DModel.Upgrade" Multiplicity="*" />
        </Association>
<EntityType Name="Upgrade">
          <Key>
            <PropertyRef Name="UpgradeID" />
          </Key>
          <Property Name="UpgradeID" Nullable="false" annotation:StoreGeneratedPattern="Identity" Type="Int32" />
          <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" />
          <NavigationProperty Name="DefaultOption" Relationship="DModel.Upgrade_DefaultOption" FromRole="Upgrades" ToRole="Options" />
          <NavigationProperty Name="OptInOptions" Relationship="DModel.OptInOptions" FromRole="Upgrades" ToRole="Options" />
        </EntityType>
     </Schema>
    </edmx:ConceptualModels>

   <!-- C-S mapping content -->
    <edmx:Mappings>
      <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
        <EntityContainerMapping StorageEntityContainer="DModelStoreContainer" CdmEntityContainer="DEntities">
          <EntitySetMapping Name="Upgrades"><EntityTypeMapping TypeName="DModel.Upgrade"><MappingFragment StoreEntitySet="Upgrades">
            <ScalarProperty Name="UpgradeID" ColumnName="UpgradeID" />
            <ScalarProperty Name="Name" ColumnName="Name" />
          </MappingFragment></EntityTypeMapping></EntitySetMapping>
 <AssociationSetMapping Name="Upgrade_DefaultOption" TypeName="DModel.Upgrade_DefaultOption" StoreEntitySet="FK__Upgrades__Defaul__70DDC3D8">
            <EndProperty Name="Upgrades">
              <ScalarProperty Name="UpgradeID" ColumnName="UpgradeID"/>
            </EndProperty>
            <EndProperty Name="Options">
              <ScalarProperty Name="KitNodeID" ColumnName="DefaultOptionID"/>
            </EndProperty>
          </AssociationSetMapping>
 </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>

它会生成代码,但是当我尝试使用它时,我得到一个“错误 2007:指定为此 MSL 的一部分的表 'FK_升级_Defaul__70DDC3D8' 在 MetadataWorkspace 中不存在。”看起来它找不到 SSDL 应该使用的底层外键约束,但我确实在数据库中看到了一个具有该名称的约束。

真的,我觉得我对这种映射一般应该如何工作没有很好的理解——数据库中的外键约束真的被视为“关联集”吗? - 但这是我能做的最接近的。我不知道是否有人可以从我提供的信息中诊断出问题,但是关于在哪里查找的任何指示?我尝试了各种方法,例如将 StoreEntitySet 更改为指向 Options 等,但它们只会导致不同的错误。

【问题讨论】:

如果您清理解决方案并更新 edmx 文件会发生什么情况? 【参考方案1】:

尝试更改定义外键的方式,请参阅:How do I create a foreign key in SQL Server?

您可能必须删除并重新创建模型。

【讨论】:

出于各种原因,我们最终完全放弃了 EF,但感谢您的回答。

以上是关于实体框架:0..1 对多外键约束无法识别?的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2015 中无法识别 LocalDB

hibernate框架学习笔记9:多对多关系案例

连接列无法识别实体关系

Django 多外键导航

iOS - 添加约束后无法识别触摸

TypeORM/MySQL:无法删除或更新父行:外键约束失败