C# 每种类型使用表的EF4继承问题

C# 每种类型使用表的EF4继承问题,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,我在尝试让继承在EF4中工作时遇到了不少麻烦。最初的模型相当大,但是我已经成功地在一个只有两个实体的模型中复制了它 基本上,这两个表是“资产”和“调查问卷”。问卷继承资产(即问卷是资产)。他们通过让AssetID链接回资产来实现这一点。从技术上讲,设计可能不是最好的,但我正试图使这个10年的数据库没有任何重大的重新设计工作 鉴于此,各表如下: 资产 AssetID uniqueidentifier NOT NULL-此表的主键 其他无关栏目 内容调查问卷 Id uniqueidentifi

我在尝试让继承在EF4中工作时遇到了不少麻烦。最初的模型相当大,但是我已经成功地在一个只有两个实体的模型中复制了它

基本上,这两个表是“资产”和“调查问卷”。问卷继承资产(即问卷是资产)。他们通过让AssetID链接回资产来实现这一点。从技术上讲,设计可能不是最好的,但我正试图使这个10年的数据库没有任何重大的重新设计工作

鉴于此,各表如下:

资产

  • AssetID uniqueidentifier NOT NULL-此表的主键
  • 其他无关栏目
内容调查问卷

  • Id uniqueidentifier非空-此表的主键
  • AssetID uniqueidentifier非空-Asset.AssetID的外键
  • 其他无关栏目
这方面的模型极为简单——本质上是:

此文件的EDMX文件是:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>
    <Schema Namespace="SnapServerModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
        <EntityContainer Name="SnapServerModelStoreContainer">
          <EntitySet Name="Asset" EntityType="SnapServerModel.Store.Asset" store:Type="Tables" Schema="dbo" />
          <EntitySet Name="Content_Questionnaire" EntityType="SnapServerModel.Store.Content_Questionnaire" store:Type="Tables" Schema="dbo" />
          <AssociationSet Name="FK_Content_Questionnaire_Asset" Association="SnapServerModel.Store.FK_Content_Questionnaire_Asset">
            <End Role="Asset" EntitySet="Asset" />
            <End Role="Content_Questionnaire" EntitySet="Content_Questionnaire" />
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Asset">
          <Key>
            <PropertyRef Name="AssetID" />
          </Key>
          <Property Name="AssetID" Type="uniqueidentifier" Nullable="false" />
        </EntityType>
        <EntityType Name="Content_Questionnaire">
          <Key>
            <PropertyRef Name="Id" />
          </Key>
          <Property Name="Id" Type="uniqueidentifier" Nullable="false" />
          <Property Name="AssetID" Type="uniqueidentifier" Nullable="false" />
        </EntityType>
        <Association Name="FK_Content_Questionnaire_Asset">
          <End Role="Asset" Type="SnapServerModel.Store.Asset" Multiplicity="1" />
          <End Role="Content_Questionnaire" Type="SnapServerModel.Store.Content_Questionnaire" Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="Asset">
              <PropertyRef Name="AssetID" />
            </Principal>
            <Dependent Role="Content_Questionnaire">
              <PropertyRef Name="AssetID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
      </Schema></edmx:StorageModels>
    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema Namespace="SnapServerModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
        <EntityContainer Name="SnapServerEntities" annotation:LazyLoadingEnabled="true">
          <EntitySet Name="Assets" EntityType="SnapServerModel.Asset" />
          <AssociationSet Name="FK_Content_Questionnaire_Asset" Association="SnapServerModel.FK_Content_Questionnaire_Asset">
            <End Role="Asset" EntitySet="Assets" />
            <End Role="Content_Questionnaire" EntitySet="Assets" />
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Asset">
          <Key>
            <PropertyRef Name="AssetID" />
          </Key>
          <Property Type="Guid" Name="AssetID" Nullable="false" />
          <NavigationProperty Name="Content_Questionnaire" Relationship="SnapServerModel.FK_Content_Questionnaire_Asset" FromRole="Asset" ToRole="Content_Questionnaire" />
        </EntityType>
        <EntityType Name="Content_Questionnaire" BaseType="SnapServerModel.Asset">
          <Property Type="Guid" Name="Id" Nullable="false" />
          <NavigationProperty Name="Asset" Relationship="SnapServerModel.FK_Content_Questionnaire_Asset" FromRole="Content_Questionnaire" ToRole="Asset" />
        </EntityType>
        <Association Name="FK_Content_Questionnaire_Asset">
          <End Type="SnapServerModel.Asset" Role="Asset" Multiplicity="1" />
          <End Type="SnapServerModel.Content_Questionnaire" Role="Content_Questionnaire" Multiplicity="1" />
          <ReferentialConstraint>
            <Principal Role="Asset">
              <PropertyRef Name="AssetID" />
            </Principal>
            <Dependent Role="Content_Questionnaire">
              <PropertyRef Name="AssetID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
      </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="SnapServerModelStoreContainer" CdmEntityContainer="SnapServerEntities">
          <EntitySetMapping Name="Assets">
            <EntityTypeMapping TypeName="IsTypeOf(SnapServerModel.Asset)">
              <MappingFragment StoreEntitySet="Asset">
                <ScalarProperty Name="AssetID" ColumnName="AssetID" />
                </MappingFragment>
            </EntityTypeMapping>
            <EntityTypeMapping TypeName="IsTypeOf(SnapServerModel.Content_Questionnaire)">
              <MappingFragment StoreEntitySet="Content_Questionnaire">
                <ScalarProperty Name="Id" ColumnName="Id" />
                <ScalarProperty Name="AssetID" ColumnName="AssetID" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
        </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>
  </edmx:Runtime>
  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
    <Connection>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
      </DesignerInfoPropertySet>
    </Connection>
    <Options>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="ValidateOnBuild" Value="true" />
        <DesignerProperty Name="EnablePluralization" Value="True" />
        <DesignerProperty Name="IncludeForeignKeysInModel" Value="True" />
      </DesignerInfoPropertySet>
    </Options>
    <!-- Diagram content (shape and connector positions) -->
    <Diagrams>
      <Diagram Name="Model1">
        <EntityTypeShape EntityType="SnapServerModel.Asset" Width="1.5" PointX="0.75" PointY="2.125" Height="1.4033821614583335" />
        <EntityTypeShape EntityType="SnapServerModel.Content_Questionnaire" Width="1.5" PointX="3" PointY="2.125" Height="1.4033821614583339" />
        <AssociationConnector Association="SnapServerModel.FK_Content_Questionnaire_Asset" >
          <ConnectorPoint PointX="2.25" PointY="2.4133455403645834" />
          <ConnectorPoint PointX="3" PointY="2.4133455403645834" />
        </AssociationConnector>
        <InheritanceConnector EntityType="SnapServerModel.Content_Questionnaire" ManuallyRouted="false" >
          <ConnectorPoint PointX="2.25" PointY="2.8266910807291667" />
          <ConnectorPoint PointX="3" PointY="2.8266910807291667" />
        </InheritanceConnector>
      </Diagram>
    </Diagrams>
  </Designer>
</edmx:Edmx>

现在我的问题是,无论我尝试了什么,我都会收到两条错误消息:

  • 错误1错误3002:映射从第87行开始的片段时出现问题:表内容调查问卷的键(Content\u inventory.Id)可能发生运行时冲突:列(Content\u inventory.Id)在概念端映射到EntitySet资产的属性(Assets.Id),但它们不构成EntitySet的键属性(Assets.AssetID)。
  • 错误2错误3003:映射从第87行开始的片段时出现问题:EntitySet资产的所有键属性(Assets.AssetID)必须映射到表内容调查问卷的所有键属性(Content\u inventory.Id)。
  • 我究竟怎样才能摆脱这些错误呢

    这可能是我所缺少的一些非常明显的东西,但是任何帮助,甚至是在正确的方向上的轻推,都将不胜感激。今天,我一直在努力克服这一点


    提前感谢您可能提供的任何帮助。

    好的,您需要在模型中解决一些问题:

    1.首先,您需要将Content_问卷表上的主键更改为AssetID,据我所知,只有当关联在两端的主键上时,EF才支持2个实体之间的继承。因此,它应该如下所示:

    <EntityType Name="Content_Questionnaire">
        <Key>
            <!--First Change:-->
            <PropertyRef Name="AssetID" />
        </Key>
        <Property Name="Id" Type="uniqueidentifier" Nullable="false" />
        <Property Name="AssetID" Type="uniqueidentifier" Nullable="false" />
    </EntityType>
    
    
    
    2.派生实体上的多重数必须为0..1(目前为*)

    
    
    3.此外,在模型曲面上,只需选择两个实体之间的关联线并将其删除(导航属性将消失),通过继承,您不需要这样做。


    现在,再次尝试构建您的项目,您将看到编译错误已经消失。

    为什么您有一对一的关系?谢谢-这是下面解决方案中的问题之一:根本不应该指定这种关系。不幸的是,设计师将其抛入其中-需要一点核心理解来修复似乎是设计师!你是一个传奇人物-谢谢你。现在解释清楚了就有意义了!哈哈,我当然不是,但这太过奖了,谢谢!
    <Association Name="FK_Content_Questionnaire_Asset">
      <End Role="Asset" Type="SnapServerModel.Store.Asset" Multiplicity="1" />
      <!--Secound Change:-->
      <End Role="Content_Questionnaire" 
    Type="SnapServerModel.Store.Content_Questionnaire" Multiplicity="0..1" />
      <ReferentialConstraint>
        <Principal Role="Asset">
          <PropertyRef Name="AssetID" />
        </Principal>
        <Dependent Role="Content_Questionnaire">
          <PropertyRef Name="AssetID" />
        </Dependent>
      </ReferentialConstraint>
    </Association>