如何:定义单个实体映射到两个表的模型

本主题介绍如何手动创建一个概念模型,其中将一个实体类型映射到基础数据库中的两个表。 可以使用相同的概念将一个实体类型映射到两个以上的表。

Bb896233.note(zh-cn,VS.100).gif注意:
建议使用 ADO.NET Entity Data Model Tools来定义实体类型映射到多个表的模型。有关更多信息,请参见Walkthrough: Mapping an Entity to Multiple Tables

只有在满足以下条件的情况下,才应将一个实体类型映射到多个表:

  • 要映射的多个表共享一个公共键。

  • 所映射的实体类型在每个基础表中有对应的项。 换言之,该实体类型表示的数据在两个表之间具有一对一的对应关系;该实体类型表示两个表的内部联接。

以下是手动定义一个实体映射到两个表的模型的基本步骤:

  1. 定义一个实体类型,该类型的属性对应于每个基础表中的列。 有关更多信息,请参见 EntityType 元素 (CSDL)

  2. 通过对每个基础表使用 MappingFragment 元素,定义实体类型的映射。 有关更多信息,请参见 EntityTypeMapping 元素 (MSL)MappingFragment 元素 (MSL)

下面的示例假定您已经安装了 School 示例数据库,并且您已经手动将项目配置为使用实体框架 : 有关更多信息,请参见 创建 School 示例数据库(实体框架快速入门)配置实体框架(实体框架任务)

Bb896233.note(zh-cn,VS.100).gif注意:
下面的示例将一个实体类型映射到 School 示例数据库中的 PersonOfficeAssignement 表。注意,将实体类型映射到这些表的条件得到了满足。也就是说,两个表的内部联接将导致所有人都会分配到办公室。

创建存储模型

  1. 将下面的 XML 文件添加到您的项目中并将其命名为 School.ssdl

    <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" 
            ProviderManifestToken="2008" 
            xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" 
            xmlns="https://schemas.microsoft.com/ado/2009/02/edm/ssdl">
      <EntityContainer Name="SchoolModelStoreContainer">
        <EntitySet Name="OfficeAssignment" EntityType="SchoolModel.Store.OfficeAssignment" 
                   store:Type="Tables" Schema="dbo" />
        <EntitySet Name="Person" EntityType="SchoolModel.Store.Person" 
                   store:Type="Tables" Schema="dbo" />
      </EntityContainer>
      <EntityType Name="OfficeAssignment">
        <Key>
          <PropertyRef Name="InstructorID" />
        </Key>
        <Property Name="InstructorID" Type="int" Nullable="false" />
        <Property Name="Location" Type="nvarchar" Nullable="false" MaxLength="50" />
        <Property Name="Timestamp" Type="timestamp" Nullable="false" 
                  StoreGeneratedPattern="Computed" />
      </EntityType>
      <EntityType Name="Person">
        <Key>
          <PropertyRef Name="PersonID" />
        </Key>
        <Property Name="PersonID" Type="int" Nullable="false" 
                  StoreGeneratedPattern="Identity" />
        <Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
        <Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="50" />
        <Property Name="HireDate" Type="datetime" />
        <Property Name="EnrollmentDate" Type="datetime" />
      </EntityType>
    </Schema>
    

创建概念模型

  1. 将下面的 XML 文件添加到您的项目中并将其命名为 School.csdl。 注意下列事项:

    • Instructor 实体类型具有映射到 PersonOfficeAssignment 表中的所有列的属性(有关这两个表的详细信息,请参见上面的存储模型)。

      Bb896233.note(zh-cn,VS.100).gif注意:
      因为 Instructor 实体类型是一个继承的类型,所以它会继承其基类型 Person 的所有属性。除了具有 Instructor 类型特有的属性之外,Instructor 实体类型还具有映射到基础表的所有列的属性。

    <Schema Namespace="SchoolModel" Alias="Self" 
            xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" 
            xmlns="https://schemas.microsoft.com/ado/2008/09/edm">
      <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true">
        <EntitySet Name="People" EntityType="SchoolModel.Person" />
      </EntityContainer>
      <EntityType Name="Person">
        <Key>
          <PropertyRef Name="PersonID" />
        </Key>
        <Property Type="Int32" Name="PersonID" Nullable="false" 
                  annotation:StoreGeneratedPattern="Identity" />
        <Property Type="String" Name="LastName" Nullable="false" 
                  MaxLength="50" FixedLength="false" Unicode="true" />
        <Property Type="String" Name="FirstName" Nullable="false" 
                  MaxLength="50" FixedLength="false" Unicode="true" />
        <Property Type="DateTime" Name="EnrollmentDate" />
      </EntityType>
      <EntityType Name="Instructor" BaseType="SchoolModel.Person" >
        <Property Type="DateTime" Name="HireDate" Nullable="false" />
        <Property Type="Binary" Name="Timestamp" Nullable="false" 
                  MaxLength="8" FixedLength="true" 
                  annotation:StoreGeneratedPattern="Computed" />
        <Property Type="String" Name="Location" Nullable="false" 
                  MaxLength="50" FixedLength="false" Unicode="true" />
      </EntityType>
    </Schema>
    

定义概念模型与存储模型之间的映射

  1. 将下面的 XML 文件添加到您的项目中并将其命名为 School.msl。 注意下列事项:

    • 在 Instructor 实体类型的 EntityTypeMapping 元素内,使用单独的 MappingFragment 元素将属性映射到适当的表。
    <Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
        <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" 
                                CdmEntityContainer="SchoolEntities">
          <EntitySetMapping Name="People">
            <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Instructor)">
              <MappingFragment StoreEntitySet="Person">
                <ScalarProperty Name="PersonID" ColumnName="PersonID" />
                <ScalarProperty Name="HireDate" ColumnName="HireDate" />
                <Condition ColumnName="HireDate" IsNull="false" />
              </MappingFragment>
              <MappingFragment StoreEntitySet="OfficeAssignment">
                <ScalarProperty Name="PersonID" ColumnName="InstructorID" />
                <ScalarProperty Name="Timestamp" ColumnName="Timestamp" />
                <ScalarProperty Name="Location" ColumnName="Location" />
              </MappingFragment>
            </EntityTypeMapping>
            <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Person)">
              <MappingFragment StoreEntitySet="Person">
                <ScalarProperty Name="PersonID" ColumnName="PersonID" />
                <ScalarProperty Name="LastName" ColumnName="LastName" />
                <ScalarProperty Name="FirstName" ColumnName="FirstName" />
                <ScalarProperty Name="EnrollmentDate" ColumnName="EnrollmentDate" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
        </EntityContainerMapping>
    </Mapping>
    

另请参见

其他资源

CSDL、SSDL 和 MSL 规范
定义高级数据模型(实体框架任务)