Freigeben über


Gewusst wie: Definieren eines Modells mit mehreren Entitätenmengen pro Typ (Entity Framework)

In diesem Thema wird das Erstellen eines konzeptionellen Modells mit mehreren Entitätenmengen pro Typ (MEST) beschrieben. Das Definieren mehrerer Entitätenmengen pro Typ (Multiple Entity Sets per Type, MEST) ermöglicht es Ihnen, den Code zu optimieren, wenn mehrere Tabellen der zugrunde liegenden Datenbank über dieselbe Struktur verfügen. Wenn Sie mit Entitätstypen arbeiten, die nicht über Zuordnungen zu anderen Typen verfügen, ist das Definieren eines MEST-Modells unkompliziert. Um ein MEST-Modell für Entitätstypen zu definieren, die über Zuordnungen zu anderen Typen verfügen, ist es jedoch erforderlich, MEST für jeden Typ im Objektdiagramm zu implementieren. Weitere Informationen finden Sie unter MEST - What is it and how does it work? In diesem Thema wird das Definieren eines MEST-Modells für einen Entitätstyp beschrieben, der nicht über Zuordnungen zu anderen Typen verfügt.

Beachten Sie, dass Sie MEST nur implementieren sollten, wenn die zugrunde liegenden Datenbanktabellen über dieselbe Struktur verfügen.

Zum Definieren eines MEST-Modells sind die folgenden grundlegenden Schritte erforderlich:

  1. Verwenden mehrerer EntitySet-Elemente (jedes mit dem gleichen Wert für das EntityType-Attribut), um mehrere Entitätenmengen für einen angegebenen Typ im konzeptionellen Modell zu definieren

  2. Zuordnen der einzelnen Entitätenmengen zu der entsprechenden Tabelle in der Mapping-Spezifikationssprache (Mapping Specification Language, MSL) Weitere Informationen finden Sie unter EntitySetMapping-Element (MSL).

Im folgenden Beispiel wird davon ausgegangen, dass die folgende Beispieldatenbank installiert ist:

USE [master]
GO
CREATE DATABASE [TestDB] 
GO

SET QUOTED_IDENTIFIER OFF;
SET ANSI_NULLS ON;
GO

USE [TestDB]
GO

-- --------------------------------------------------
-- Create Tables
-- --------------------------------------------------

-- Creating table 'GraduateCourses'
CREATE TABLE [dbo].[GraduateCourses] (
    [GraduateCourseId] int  NOT NULL,
    [Title] nvarchar(max)  NOT NULL,
    [Credits] int  NOT NULL
);
GO
-- Creating table 'UnderGraduateCourses'
CREATE TABLE [dbo].[UnderGraduateCourses] (
    [UnderGraduateCourseId] int  NOT NULL,
    [Title] nvarchar(max)  NOT NULL,
    [Credits] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key in table 'GraduateCourses'
ALTER TABLE [dbo].[GraduateCourses] WITH NOCHECK 
ADD CONSTRAINT [PK_GraduateCourses]
    PRIMARY KEY CLUSTERED ([GraduateCourseId] ASC)
    ON [PRIMARY]
GO
-- Creating primary key in table 'UnderGraduateCourses'
ALTER TABLE [dbo].[UnderGraduateCourses] WITH NOCHECK 
ADD CONSTRAINT [PK_UnderGraduateCourses]
    PRIMARY KEY CLUSTERED ([UnderGraduateCourseId] ASC)
    ON [PRIMARY]
GO

Des Weiteren wird im Beispiel davon ausgegangen, dass Sie das Projekt für die Verwendung des konfiguriert haben. Weitere Informationen finden Sie unter Konfigurieren des Entity Framework (Entity Framework-Aufgaben).

So erstellen Sie das Speichermodell

  1. Fügen Sie dem Projekt die folgende XML-Datei hinzu, und geben Sie ihr den Namen MEST.ssdl.

    – ODER –

    Fügen Sie dem Projekt eine leere EDMX-Datei (MEST.edmx) hinzu, und ersetzen Sie das Schema-Element unter dem edmx:StorageModels -Element durch das Schema-Element in der folgenden XML-Datei. Weitere Informationen finden Sie unter How to: Create a New .edmx File und .edmx File Overview.

    Beachten Sie, dass die Tabellen im Speichermodell über die gleiche Struktur verfügen.

    <?xml version="1.0" encoding="utf-8" ?>
    <Schema Namespace="MEST.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="MESTStoreContainer">
        <EntitySet Name="GraduateCourses"
                   EntityType="MEST.Store.GraduateCourses"
                   store:Type="Tables" Schema="dbo" />
        <EntitySet Name="UnderGraduateCourses"
                   EntityType="MEST.Store.UnderGraduateCourses"
                   store:Type="Tables" Schema="dbo" />
      </EntityContainer>
      <EntityType Name="GraduateCourses">
        <Key>
          <PropertyRef Name="GraduateCourseId" />
        </Key>
        <Property Name="GraduateCourseId" Type="int" Nullable="false" />
        <Property Name="Title" Type="nvarchar(max)" Nullable="false" />
        <Property Name="Credits" Type="int" Nullable="false" />
      </EntityType>
      <EntityType Name="UnderGraduateCourses">
        <Key>
          <PropertyRef Name="UnderGraduateCourseId" />
        </Key>
        <Property Name="UnderGraduateCourseId" Type="int" Nullable="false" />
        <Property Name="Title" Type="nvarchar(max)" Nullable="false" />
        <Property Name="Credits" Type="int" Nullable="false" />
      </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 MEST.csdl.

    – ODER –

    Ersetzen Sie in der EDMX-Datei das Schema -Element im edmx:ConceptualModels -Element durch das Schema -Element in der folgenden XML-Datei.

    Beachten Sie, dass zwei Entitätenmengen für den Course-Entitätstyp definiert wurden.

    <?xml version="1.0" encoding="utf-8" ?>
    <Schema xmlns="https://schemas.microsoft.com/ado/2008/09/edm"
                  xmlns:cg="https://schemas.microsoft.com/ado/2006/04/codegeneration"
                  xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
                  Namespace="MEST" Alias="Self"
                  xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation">
      <EntityContainer Name="MESTContainer" annotation:LazyLoadingEnabled="true">
        <EntitySet Name="GraduateCourses" EntityType="MEST.Course" />
        <EntitySet Name="UnderGraduateCourses" EntityType="MEST.Course" />
      </EntityContainer>
      <EntityType Name="Course">
        <Key>
          <PropertyRef Name="CourseId" />
        </Key>
        <Property Type="Int32" Name="CourseId" Nullable="false" />
        <Property Type="String" Name="Title" Nullable="false" />
        <Property Type="Int32" Name="Credits" Nullable="false" />
      </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 MEST.msl.

    – ODER –

    Ersetzen Sie in der EDMX-Datei das Mapping -Element im edmx:Mappings -Element durch das Mapping -Element in der folgenden XML-Datei.

    Beachten Sie, dass jede Entitätenmenge der entsprechenden zugrunde liegenden Datenbank zugeordnet wird.

    <?xml version="1.0" encoding="utf-8" ?>
    <Mapping Space="C-S"
                 xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
      <EntityContainerMapping StorageEntityContainer="MESTStoreContainer"
                              CdmEntityContainer="MESTContainer">
        <EntitySetMapping Name="GraduateCourses">
          <EntityTypeMapping TypeName="IsTypeOf(MEST.Course)">
            <MappingFragment StoreEntitySet="GraduateCourses">
              <ScalarProperty Name="CourseId" ColumnName="GraduateCourseId" />
              <ScalarProperty Name="Title" ColumnName="Title" />
              <ScalarProperty Name="Credits" ColumnName="Credits" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
        <EntitySetMapping Name="UnderGraduateCourses">
          <EntityTypeMapping TypeName="IsTypeOf(MEST.Course)">
            <MappingFragment StoreEntitySet="UnderGraduateCourses">
              <ScalarProperty Name="CourseId" ColumnName="UnderGraduateCourseId" />
              <ScalarProperty Name="Title" ColumnName="Title" />
              <ScalarProperty Name="Credits" ColumnName="Credits" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
      </EntityContainerMapping>
    </Mapping>
    

Siehe auch

Weitere Ressourcen

CSDL-, SSDL- und MSL-Spezifikationen
Definieren von erweiterten Datenmodellen (Entity Framework-Aufgaben)
ADO.NET Entity Data Model Tools