共用方式為


HOW TO:使用對應至兩份資料表的單一實體來定義模型

本主題描述如何手動建立概念模型,其中實體類型會對應到基礎資料庫中的兩個資料表。 您可以使用這些相同的概念,將實體類型對應到兩個以上的資料表。

Bb896233.note(zh-tw,VS.100).gif注意:
建議您使用 ADO.NET Entity Data Model Tools來定義模型,讓模型中的實體類型對應到多個資料表。如需詳細資訊,請參閱Walkthrough: Mapping an Entity to Multiple Tables

只有當下列條件成立時,才能將實體類型對應到多個資料表:

  • 您所對應到的資料表會共用一個索引鍵。

  • 正在對應的實體類型在每一個基礎資料表中都有項目。 換句話說,實體類型代表在兩個資料表之間擁有一對一關係的資料,實體類型代表兩個資料表的內部聯結 (Inner Join)。

如果要手動定義包含了對應至兩個資料表之實體的模型,基本步驟如下:

  1. 定義實體類型,其屬性會對應到每一個基礎資料表中的資料行。 如需詳細資訊,請參閱 EntityType 項目 (CSDL)

  2. 針對每一個基礎資料表使用 MappingFragment 項目,定義實體類型的對應。 如需詳細資訊,請參閱 EntityTypeMapping 項目 (MSL)MappingFragment 項目 (MSL)

下列範例假設您已經安裝 School 範例資料庫,而且已經手動設定您的專案使用 Entity Framework 。 如需詳細資訊,請參閱建立 School 範例資料庫 (Entity Framework 快速入門)設定 Entity Framework (Entity Framework 工作)

Bb896233.note(zh-tw,VS.100).gif注意:
下列範例會將實體類型對應到 School 範例資料庫中的 PersonOfficeAssignement 資料表。請注意,已符合將實體類型對應至這些資料表的條件。也就是說,兩個資料表的內部聯結 (Inner Join) 將會產生所有有分派辦公室的人。

若要建立儲存體模型

  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-tw,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 規格
定義進階資料模型 (Entity Framework 工作)