.net 实体框架:模型优先,继承?

.net 实体框架:模型优先,继承?,.net,entity-framework,inheritance,ef-model-first,.net,Entity Framework,Inheritance,Ef Model First,我有一个Person表、一个Employee表和一个Contractor表。所有员工都是人,所有承包商都是人,每个人都是员工或承包商。像这样: 我怎样才能首先使用模型来实现这个概念?继承?您有三种选择: 1-每个层次结构的表格: 性能良好,因为需要一个物理表。您需要向个人添加一个鉴别器字段,例如“PersonType”。这种方法的问题(我发现)是,最终会出现大量可为空的字段,并且派生类型之间的导航属性很难(以我的经验) 2-每种类型的表格: 需要单独的表,但如果您想创建另一个“Person”类型

我有一个Person表、一个Employee表和一个Contractor表。所有员工都是人,所有承包商都是人,每个人都是员工或承包商。像这样:


我怎样才能首先使用模型来实现这个概念?继承?

您有三种选择:

1-每个层次结构的表格: 性能良好,因为需要一个物理表。您需要向个人添加一个鉴别器字段,例如“PersonType”。这种方法的问题(我发现)是,最终会出现大量可为空的字段,并且派生类型之间的导航属性很难(以我的经验)

2-每种类型的表格: 需要单独的表,但如果您想创建另一个“Person”类型,则这有利于灵活性

3-每种混凝土类型的表:没有这方面的经验,因此无法对其进行评论。好吧,这和TPT非常相似

我可能会选择TPT,只是因为它更容易

尽管如此,“Contractor”和“Employee”表中的字段是同一类型的,因此您可以将其概括为具有TPH的单个字段。但我猜这不是完整的模型

模型优先的步骤:

  • 将这三个实体添加到空白EDMX
  • 将“Person”标记为抽象
  • 将“承包商”和“员工”设置为从“人员”派生。(添加->继承)
  • 从“雇员”和“承包商”实体中删除ID字段(不需要-它将从“个人”继承ID)
  • 从模型生成数据库

  • 表结构+继承==TPT。在designer中,它将如下所示:

    …和实体的原始EDMX以及到这些表的映射:

    <?xml version="1.0" encoding="utf-8"?>
    <edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns:ssdl="http://schemas.microsoft.com/ado/2009/02/edm/ssdl" xmlns:edm="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:map="http://schemas.microsoft.com/ado/2008/09/mapping/cs" xmlns:codegen="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:huagati="http://www.huagati.com/edmxtools/annotations">
      <!--Updated by Huagati EDMX Tools version 2.16.4007.30259 on 2010-12-23 09:13:27-->
      <!-- EF Runtime content -->
      <edmx:Runtime>
        <!-- SSDL content -->
        <edmx:StorageModels>
          <Schema xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl" Namespace="Model1.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008">
            <EntityContainer Name="Model1TargetContainer">
              <EntitySet Name="Person" store:Type="Tables" Schema="dbo" Table="Person" store:Name="Person" EntityType="Model1.Store.Person" />
              <EntitySet Name="Employee" store:Type="Tables" Schema="dbo" Table="Employee" store:Name="Employee" EntityType="Model1.Store.Employee" />
              <AssociationSet Name="FK_Employee_Person" Association="Model1.Store.FK_Employee_Person">
                <End Role="Person" EntitySet="Person" />
                <End Role="Employee" EntitySet="Employee" />
              </AssociationSet>
              <EntitySet Name="Contractor" store:Type="Tables" Schema="dbo" Table="Contractor" store:Name="Contractor" EntityType="Model1.Store.Contractor" />
              <AssociationSet Name="FK_Contractor_Person" Association="Model1.Store.FK_Contractor_Person">
                <End Role="Person" EntitySet="Person" />
                <End Role="Contractor" EntitySet="Contractor" />
              </AssociationSet>
            </EntityContainer>
            <EntityType Name="Person">
              <Documentation />
              <Key>
                <PropertyRef Name="PersonId" />
              </Key>
              <Property Name="PersonId" Type="bigint" Nullable="false" StoreGeneratedPattern="Identity" />
              <Property Name="Name" Type="nvarchar" Nullable="true" MaxLength="50" />
            </EntityType>
            <EntityType Name="Employee">
              <Documentation />
              <Key>
                <PropertyRef Name="EmployeeId" />
              </Key>
              <Property Name="EmployeeId" Type="bigint" Nullable="false" />
              <Property Name="EmployeeNumber" Type="nvarchar" Nullable="true" MaxLength="50" />
            </EntityType>
            <Association Name="FK_Employee_Person">
              <End Multiplicity="1" Role="Person" Type="Model1.Store.Person" />
              <End Multiplicity="0..1" Role="Employee" Type="Model1.Store.Employee" />
              <ReferentialConstraint>
                <Principal Role="Person">
                  <PropertyRef Name="PersonId" />
                </Principal>
                <Dependent Role="Employee">
                  <PropertyRef Name="EmployeeId" />
                </Dependent>
              </ReferentialConstraint>
            </Association>
            <EntityType Name="Contractor">
              <Documentation />
              <Key>
                <PropertyRef Name="ContractorId" />
              </Key>
              <Property Name="ContractorId" Type="bigint" Nullable="false" />
              <Property Name="ContractorNumber" Type="nvarchar" Nullable="true" MaxLength="50" />
            </EntityType>
            <Association Name="FK_Contractor_Person">
              <End Multiplicity="1" Role="Person" Type="Model1.Store.Person" />
              <End Multiplicity="0..1" Role="Contractor" Type="Model1.Store.Contractor" />
              <ReferentialConstraint>
                <Principal Role="Person">
                  <PropertyRef Name="PersonId" />
                </Principal>
                <Dependent Role="Contractor">
                  <PropertyRef Name="ContractorId" />
                </Dependent>
              </ReferentialConstraint>
            </Association>
          </Schema>
        </edmx:StorageModels>
        <!-- CSDL content -->
        <edmx:ConceptualModels>
          <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="Model1" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation">
            <EntityContainer Name="Model1Container" annotation:LazyLoadingEnabled="true">
              <EntitySet Name="Person" EntityType="Model1.Person" huagati:InheritanceStrategy="TPT" />
            </EntityContainer>
            <EntityType Name="Person">
              <Key>
                <PropertyRef Name="PersonId" />
              </Key>
              <Property Type="Int64" Name="PersonId" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
              <Property Type="String" Name="Name" Unicode="true" MaxLength="50" Nullable="true" />
            </EntityType>
            <EntityType Name="Employee" BaseType="Model1.Person">
              <Property Type="String" Name="EmployeeNumber" Unicode="true" MaxLength="50" Nullable="true" />
            </EntityType>
            <EntityType Name="Contractor" BaseType="Model1.Person">
              <Property Type="String" Name="ContractorNumber" Nullable="true" Unicode="true" MaxLength="50" />
            </EntityType>
          </Schema>
        </edmx:ConceptualModels>
        <!-- C-S mapping content -->
        <edmx:Mappings>
          <Mapping xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs" Space="C-S">
            <Alias Key="Model" Value="Model1" />
            <Alias Key="Target" Value="Model1.Store" />
            <EntityContainerMapping CdmEntityContainer="Model1Container" StorageEntityContainer="Model1TargetContainer">
              <EntitySetMapping Name="Person">
                <EntityTypeMapping TypeName="IsTypeOf(Model1.Person)">
                  <MappingFragment StoreEntitySet="Person">
                    <ScalarProperty Name="PersonId" ColumnName="PersonId" />
                    <ScalarProperty Name="Name" ColumnName="Name" />
                  </MappingFragment>
                </EntityTypeMapping>
                <EntityTypeMapping TypeName="IsTypeOf(Model1.Employee)">
                  <MappingFragment StoreEntitySet="Employee">
                    <ScalarProperty Name="PersonId" ColumnName="EmployeeId" />
                    <ScalarProperty Name="EmployeeNumber" ColumnName="EmployeeNumber" />
                  </MappingFragment>
                </EntityTypeMapping>
                <EntityTypeMapping TypeName="IsTypeOf(Model1.Contractor)">
                  <MappingFragment StoreEntitySet="Contractor">
                    <ScalarProperty Name="PersonId" ColumnName="ContractorId" />
                    <ScalarProperty Name="ContractorNumber" ColumnName="ContractorNumber" />
                  </MappingFragment>
                </EntityTypeMapping>
              </EntitySetMapping>
            </EntityContainerMapping>
          </Mapping>
        </edmx:Mappings>
      </edmx:Runtime>
      <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
      <edmx:Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
        <edmx:Connection>
          <DesignerInfoPropertySet>
            <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
          </DesignerInfoPropertySet>
        </edmx:Connection>
        <edmx:Options>
          <DesignerInfoPropertySet>
            <DesignerProperty Name="ValidateOnBuild" Value="true" />
            <DesignerProperty Name="EnablePluralization" Value="True" />
          </DesignerInfoPropertySet>
        </edmx:Options>
        <!-- Diagram content (shape and connector positions) -->
        <edmx:Diagrams>
          <Diagram Name="Model1">
            <EntityTypeShape EntityType="Model1.Person" Width="1.5" PointX="5.125" PointY="2.125" Height="1.4033821614583331" />
            <EntityTypeShape EntityType="Model1.Employee" Width="1.5" PointX="3.875" PointY="4" Height="1.2110807291666665" />
            <InheritanceConnector EntityType="Model1.Employee">
              <ConnectorPoint PointX="5.875" PointY="3.5283821614583331" />
              <ConnectorPoint PointX="5.875" PointY="3.76" />
              <ConnectorPoint PointX="4.625" PointY="3.76" />
              <ConnectorPoint PointX="4.625" PointY="4" />
            </InheritanceConnector>
            <EntityTypeShape EntityType="Model1.Contractor" Width="2" PointX="5.875" PointY="4" Height="1.2110807291666665" />
            <InheritanceConnector EntityType="Model1.Contractor" ManuallyRouted="false">
              <ConnectorPoint PointX="5.875" PointY="3.5283821614583331" />
              <ConnectorPoint PointX="5.875" PointY="3.76" />
              <ConnectorPoint PointX="6.875" PointY="3.76" />
              <ConnectorPoint PointX="6.875" PointY="4" />
            </InheritanceConnector>
          </Diagram>
        </edmx:Diagrams>
      </edmx:Designer>
    </edmx:Edmx>
    
    
    
    …和…

    嘿,那张照片看起来很亲昵!:):P你知道的!我偷走了你的判决。。。再好不过了,一切都很好。我希望你能得到一些答案。祝你好运