Gewusst wie: Definieren eines Modells mit einer einzelnen Entität, der zwei Tabellen zugeordnet werden

In diesem Thema wird das manuelle Erstellen eines konzeptionellen Modells beschrieben, in dem ein Entitätstyp zwei Tabellen in der zugrunde liegenden Datenbank zugeordnet wird. Mithilfe dieser Konzepte können Sie auch einen Entitätstyp zu mehr als zwei Tabellen zuordnen.

Bb896233.note(de-de,VS.100).gifHinweis:
Es wird empfohlen, mithilfe der ADO.NET Entity Data Model Tools ein Modell mit einem Entitätstyp zu definieren, der mehreren Tabellen zugeordnet ist.Weitere Informationen finden Sie unter Walkthrough: Mapping an Entity to Multiple Tables.

Sie sollten einen Entitätstyp nur dann mehreren Tabellen zuordnen, wenn die folgenden Bedingungen zutreffen:

  • Die Tabellen, denen der Entitätstyp zugeordnet wird, besitzen einen gemeinsamen Schlüssel.

  • Der zugeordnete Entitätstyp verfügt über Einträge in jeder der zugrunde liegenden Tabellen. Anders ausgedrückt stellt der Entitätstyp Daten dar, die sich innerhalb der beiden Tabellen eins zu eins entsprechen. Der Entitätstyp stellt einen inneren Join der beiden Tabellen dar.

Die grundlegenden Schritte zum manuellen Definieren eines Modells mit einer Entität, die zwei Tabellen zugeordnet wird, lauten wie folgt:

  1. Definieren Sie einen Entitätstyp mit Eigenschaften, die Spalten in jeder der zugrunde liegenden Tabellen entsprechen. Weitere Informationen finden Sie unter EntityType-Element (CSDL).

  2. Definieren Sie die Zuordnung für den Entitätstyp mithilfe eines MappingFragment-Elements für jede zugrunde liegende Tabelle. Weitere Informationen finden Sie unter EntityTypeMapping-Element (MSL) und MappingFragment-Element (MSL).

Im folgenden Beispiel wird davon ausgegangen, dass Sie die Beispieldatenbank School installiert und das Projekt manuell zur Verwendung von Entity Framework konfiguriert haben. Weitere Informationen finden Sie unter Erstellen der Beispieldatenbank "School" (Entity Framework-Schnellstart) und Konfigurieren des Entity Framework (Entity Framework-Aufgaben).

Bb896233.note(de-de,VS.100).gifHinweis:
Im folgenden Beispiel wird den Tabellen Person und OfficeAssignement in der Beispieldatenbank School ein Entitätstyp zugeordnet.Beachten Sie, dass die Bedingungen zum Zuordnen eines Entitätstyps zu diesen Tabellen erfüllt werden.Dies bedeutet, dass ein innerer Join der zwei Tabellen im Ergebnis alle Personen auflistet, die über eine Bürozuweisung verfügen.

So erstellen Sie das Speichermodell

  1. Fügen Sie dem Projekt die folgende XML-Datei hinzu, und geben Sie ihr den Namen 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>
    

So erstellen Sie das konzeptionelle Modell

  1. Fügen Sie dem Projekt die folgende XML-Datei hinzu, und geben Sie ihr den Namen School.csdl. Beachten Sie Folgendes:

    • Der Instructor-Entitätstyp verfügt über Eigenschaften, die allen Spalten in den Tabellen Person und OfficeAssignment zugeordnet werden (Details zu den Tabellen finden Sie im o. g. Speichermodell).

      Bb896233.note(de-de,VS.100).gifHinweis:
      Da der Instructor-Entitätstyp ein geerbter Typ ist, erbt er alle Eigenschaften von seinem Basistyp Person.Zusammen mit den Eigenschaften, die ausschließlich für den Instructor-Typ gelten, besitzt der Instructor-Entitätstyp Eigenschaften, die allen Spalten der zugrunde liegenden Tabellen zugeordnet werden.

    <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>
    

So definieren Sie die Zuordnung zwischen dem konzeptionellen Modell und dem Speichermodell

  1. Fügen Sie dem Projekt die folgende XML-Datei hinzu, und geben Sie ihr den Namen School.msl. Beachten Sie Folgendes:

    • Innerhalb des EntityTypeMapping-Elements für den Instructor-Entitätstyp werden unterschiedliche MappingFragment-Elemente verwendet, um den entsprechenden Tabellen Eigenschaften zuzuordnen.
    <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>
    

Siehe auch

Weitere Ressourcen

CSDL-, SSDL- und MSL-Spezifikationen
Definieren von erweiterten Datenmodellen (Entity Framework-Aufgaben)