Freigeben über


Gewusst wie: Anpassen eines Entity Data Model zur Verwendung von benutzerdefinierten Objekten (Entity Framework)

Wenn Sie benutzerdefinierte Datenklassen mit einem Entitätsdatenmodell (EDM) verwenden möchten, müssen die in der CSDL-Datei definierten Entitätstypen und Eigenschaften den benutzerdefinierten Datenklassen entsprechen. Die Entity Framework-Tools erstellen eine Reihe von Mapping-Dateien, bei denen die Entitätstypen und Entitätenmengen in der CSDL-Datei mit den Tabellen in der Datenbank übereinstimmen. Aktualisieren Sie diese Mapping-Dateien für benutzerdefinierte Datenklassen nach dem folgenden Verfahren:

  1. Aktualisieren Sie die CSDL-Datei, sodass sie mit den benutzerdefinierten Datenklassen übereinstimmt.

  2. Aktualisieren Sie das Mapping in der MSL-Datei.

  3. Aktualisieren Sie ggf. die SSDL-Datei.

  4. Überprüfen Sie die aktualisierten Mapping-Dateien.

  5. Beenden Sie die Objektebenenerstellung von Visual Studio.

Vor dem Ausführen des Beispiels in diesem Thema müssen Sie bereits das EDM-Generator (EdmGen.exe)-Dienstprogramm oder den Assistent für Entity Data Model zur Generierung der EDM-Mappingdateien verwendet haben. Weitere Informationen finden Sie unter Gewusst wie: Verwenden von 'EdmGen.exe' zum Generieren eines Entity Data Model (Entity Framework). Bei der Verwendung des Entity Data Model-Designers in Visual Studio muss außerdem die Erstellung der Objektebene basierend auf der aktualisierten CSDL-Datei deaktiviert werden. Andernfalls befinden sich im Projekt doppelte Datenklassen.

So aktualisieren Sie die CSDL-Datei, damit sie mit den benutzerdefinierten Datenobjekten übereinstimmt

  1. Öffnen Sie die CSDL-Datei in Visual Studio oder in notepad.exe.

  2. Ändern Sie die Namen des EntityType-Elements und des EntitySet-Elements, damit sie mit den Namen der benutzerdefinierten Datenklassen übereinstimmen.

  3. Entfernen Sie das EntityType-Element und das EntitySet-Element für alle Entitäten, für die keine entsprechende benutzerdefinierte Datenklasse vorhanden sind.

  4. Ändern Sie die Namen der Property-Elemente für jeden Typ, damit sie mit den Namen der Eigenschaften in der benutzerdefinierten Datenklasse übereinstimmen.

  5. Entfernen Sie die Property-Elemente für alle Eigenschaften, die in der benutzerdefinierten Datenklasse nicht vorhanden sind.

  6. Speichern Sie die Änderungen in der CSDL-Datei.

So aktualisieren Sie die MSL-Datei, um die benutzerdefinierten Datenobjekte den Objekten der Datenquelle zuzuordnen

  1. Öffnen Sie die MSL-Datei in Visual Studio oder in notepad.exe.

  2. Ändern Sie die Namen des EntitySetMapping-Elements und des TypeName-Attributs, damit sie mit den Namen der benutzerdefinierten Klassen übereinstimmen.

  3. Entfernen Sie das EntitySetMapping-Element für jede Entität, die nicht über eine entsprechende benutzerdefinierte Datenklasse verfügt.

  4. Ändern Sie die Namen der ScalarProperty-Elemente für jeden Typ, damit sie mit den Namen der Eigenschaften in der benutzerdefinierten Datenklasse übereinstimmen.

  5. Entfernen Sie das ScalarProperty-Element für alle Eigenschaften, die in der benutzerdefinierten Datenklasse nicht vorhanden sind.

  6. Ändern Sie den Namen des EndProperty-Elements in der AssociationSetMapping, damit es mit den Namen der benutzerdefinierten Klassen übereinstimmt.

  7. Ändern Sie die Namen der ScalarProperty-Elemente in jeder AssociationSetMapping, damit sie mit den Namen der Eigenschaften in der benutzerdefinierten Datenklasse übereinstimmen.

    NoteHinweis

    Ändern Sie keine ColumnName-Eigenschaften.

  8. Entfernen Sie das AssociationSetMapping-Element für die Zuordnungen zwischen allen Entitäten, die in den benutzerdefinierten Datenklasse nicht vorhanden sind.

  9. Speichern Sie die Änderungen in der MSL-Datei.

So aktualisieren Sie die SSDL-Datei, um die Entitäten zu entfernen, die in den benutzerdefinierten Datenklassen nicht vorhanden sind

  1. Öffnen Sie die SSDL-Datei in Visual Studio oder in notepad.exe.

  2. Entfernen Sie die EntityType-Elemente für alle Entitäten, die den benutzerdefinierten Datenklassen nicht zugeordnet sind.

  3. Entfernen Sie die ScalarProperty-Elemente für alle Eigenschaften, die den Eigenschaften der benutzerdefinierten Datenklassen nicht zugeordnet sind.

  4. Speichern Sie die Änderungen in der SSDL-Datei.

So überprüfen Sie die aktualisierten Mapping-Dateien

  1. Führen Sie das Dienstprogramm EdmGen.exe in dem Verzeichnis aus, in dem sich die Mapping-Dateien befinden. Verwenden Sie den folgenden Befehl:

    %windir%\Microsoft.NET\Framework\v3.5\edmgen.exe /mode:ValidateArtifacts  
    /inssdl:.\YourModel.ssdl /inmsl:.\YourModel.msl /incsdl:.\YourModel.csdl 
    
    NoteHinweis

    Entfernen Sie Zeilenumbrüche, und ersetzen Sie YourModel durch den für Ihre Mapping-Dateien verwendeten Namen.

  2. Überprüfen Sie die Ausgabe, und beheben Sie Validierungsfehler.

Erneutes Erstellen, Speichern und Entfernen von automatisch generiertem Objektcode

  1. Klicken Sie im Projektmappen-Explorer von Visual Studio mit der rechten Maustaste auf die CSDL-Datei, und wählen Sie Benutzerdefiniertes Tool ausführen aus.

    Hierdurch wird die Objektebene auf der Grundlage der geänderten CSDL-Datei erneut erstellt.

  2. Erweitern Sie den CSDL-Dateiknoten, öffnen Sie die Designerdatei, und speichern Sie die Datei unter einem anderen Dateinamen.

    Hierdurch wird die automatisch generierte Objektebenendatei gespeichert. Im Thema Gewusst wie: Verwenden von Object Services mit benutzerdefinierten Objekten (Entity Framework) wird Code aus dieser Datei verwendet.

  3. Schließen Sie die Designerdatei vom Projekt aus.

  4. Wählen Sie die CSDL-Datei aus, und löschen Sie im Fenster Eigenschaften den Wert für Benutzerdefiniertes Tool.

    Hierdurch wird das erneute Erstellen der Objektebenendatei verhindert. Wenn diese Datei zukünftig erstellt werden soll, geben Sie im Fenster Eigenschaften für Benutzerdefiniertes Tool den Wert EntityModelCodeGenerator ein, und wiederholen Sie Schritt 1.

Beispiel

Die folgende CSDL-Datei wurde so angepasst, dass die benutzerdefinierten Datenklassen Orders und LineItem unterstützt werden.

<Schema Namespace="Microsoft.Samples.Edm" Alias="Self" xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
  <EntityContainer Name="SalesOrdersEntities">
    <EntitySet Name="LineItem" EntityType="Microsoft.Samples.Edm.LineItem" />
    <EntitySet Name="Order" EntityType="Microsoft.Samples.Edm.Order" />
    <AssociationSet Name="FK_LineItem_Order_OrderId" Association="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId">
      <End Role="Order" EntitySet="Order" />
      <End Role="LineItem" EntitySet="LineItem" />
    </AssociationSet>
  </EntityContainer>
  <EntityType Name="LineItem">
    <Key>
      <PropertyRef Name="LineItemId" />
    </Key>
    <Property Name="LineItemId" Type="Int32" Nullable="false" />
    <Property Name="TrackingNumber" Type="String" MaxLength="25" />
    <Property Name="Quantity" Type="Int16" Nullable="false" />
    <Property Name="Product" Type="Int32" Nullable="false" />
    <Property Name="Price" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="Discount" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <NavigationProperty Name="Order" Relationship="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId" 
                        FromRole="LineItem" ToRole="Order" />
  </EntityType>
  <EntityType Name="Order">
    <Key>
      <PropertyRef Name="OrderId" />
    </Key>
    <Property Name="OrderId" Type="Int32" Nullable="false" />
    <Property Name="OrderDate" Type="DateTime" Nullable="false" />
    <Property Name="DueDate" Type="DateTime" Nullable="false" />
    <Property Name="ShipDate" Type="DateTime" />
    <Property Name="Status" Type="Byte" Nullable="false" />
    <Property Name="Customer" Type="Int32" Nullable="false" />
    <Property Name="SubTotal" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="TaxAmt" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="Freight" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="ExtendedInfo" Type="Self.OrderInfo" Nullable="false" />
    <NavigationProperty Name="LineItem" Relationship="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId" 
                        FromRole="Order" ToRole="LineItem" />
  </EntityType>
    <ComplexType Name="OrderInfo">
        <Property Name="OrderNumber" Type="String" Nullable="false" MaxLength="25" />
        <Property Name="PurchaseOrder" Type="String" MaxLength="25" />
        <Property Name="AccountNumber" Type="String" MaxLength="15" />
        <Property Name="Comment" Type="String" MaxLength="128" />
    </ComplexType>
  <Association Name="FK_LineItem_Order_OrderId">
    <End Role="Order" Type="Microsoft.Samples.Edm.Order" Multiplicity="1" />
    <End Role="LineItem" Type="Microsoft.Samples.Edm.LineItem" Multiplicity="*" />
  </Association>
</Schema>

Die folgende MSL-Datei wurde so angepasst, dass die benutzerdefinierten Datenklassen Orders und LineItem den Tabellen SalesOrderHeader und SalesOrderDetail in der AdventureWorks-Datenbank zugeordnet werden.

<Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
  <EntityContainerMapping StorageEntityContainer="Sales" CdmEntityContainer="SalesOrdersEntities">
    <EntitySetMapping Name="LineItem" StoreEntitySet="SalesOrderDetail" TypeName="Microsoft.Samples.Edm.LineItem">
      <ScalarProperty Name="LineItemId" ColumnName="SalesOrderDetailID" />
      <ScalarProperty Name="TrackingNumber" ColumnName="CarrierTrackingNumber" />
      <ScalarProperty Name="Quantity" ColumnName="OrderQty" />
      <ScalarProperty Name="Product" ColumnName="ProductID" />
      <ScalarProperty Name="Price" ColumnName="UnitPrice" />
      <ScalarProperty Name="Discount" ColumnName="UnitPriceDiscount" />
    </EntitySetMapping>
    <EntitySetMapping Name="Order" StoreEntitySet="SalesOrderHeader" TypeName="Microsoft.Samples.Edm.Order">
      <ScalarProperty Name="OrderId" ColumnName="SalesOrderID" />
      <ScalarProperty Name="OrderDate" ColumnName="OrderDate" />
      <ScalarProperty Name="DueDate" ColumnName="DueDate" />
      <ScalarProperty Name="ShipDate" ColumnName="ShipDate" />
      <ScalarProperty Name="Status" ColumnName="Status" />
      <ScalarProperty Name="Customer" ColumnName="CustomerID" />
      <ScalarProperty Name="SubTotal" ColumnName="SubTotal" />
      <ScalarProperty Name="TaxAmt" ColumnName="TaxAmt" />
      <ScalarProperty Name="Freight" ColumnName="Freight" />
      <ComplexProperty Name ="ExtendedInfo" TypeName ="Microsoft.Samples.Edm.OrderInfo">
        <ScalarProperty Name="OrderNumber" ColumnName="SalesOrderNumber" />
        <ScalarProperty Name="PurchaseOrder" ColumnName="PurchaseOrderNumber" />
        <ScalarProperty Name="AccountNumber" ColumnName="AccountNumber" />
        <ScalarProperty Name="Comment" ColumnName="Comment" />
      </ComplexProperty>
    </EntitySetMapping>
    <AssociationSetMapping Name="FK_LineItem_Order_OrderId" TypeName="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId" StoreEntitySet="SalesOrderDetail">
      <EndProperty Name="Order">
        <ScalarProperty Name="OrderId" ColumnName="SalesOrderID" />
      </EndProperty>
      <EndProperty Name="LineItem">
        <ScalarProperty Name="LineItemId" ColumnName="SalesOrderDetailID" />
      </EndProperty>
      <Condition ColumnName="SalesOrderID" IsNull="false" />
    </AssociationSetMapping>
  </EntityContainerMapping>
</Mapping>

Die folgende SSDL-Datei wurde so angepasst, dass die benutzerdefinierten Datenklassen Orders und LineItem unter Verwendung der Tabellen SalesOrderHeader und SalesOrderDetail in der AdventureWorks-Datenbank unterstützt werden.

<Schema Namespace="Microsoft.Samples.Edm.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
  <EntityContainer Name="Sales">
    <EntitySet Name="SalesOrderDetail" EntityType="Microsoft.Samples.Edm.Store.SalesOrderDetail" />
    <EntitySet Name="SalesOrderHeader" EntityType="Microsoft.Samples.Edm.Store.SalesOrderHeader" />
    <AssociationSet Name="FK_LineItem_Orders_OrderId" Association="Microsoft.Samples.Edm.Store.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
      <End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
      <End Role="SalesOrderDetail" EntitySet="SalesOrderDetail" />
    </AssociationSet>
  </EntityContainer>
  <EntityType Name="SalesOrderDetail">
    <Key>
      <PropertyRef Name="SalesOrderDetailID" />
    </Key>
    <Property Name="SalesOrderID" Type="int" Nullable="false" />
    <Property Name="SalesOrderDetailID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
    <Property Name="CarrierTrackingNumber" Type="nvarchar" MaxLength="25" />
    <Property Name="OrderQty" Type="smallint" Nullable="false" />
    <Property Name="ProductID" Type="int" Nullable="false" />
    <Property Name="UnitPrice" Type="money" Nullable="false" />
    <Property Name="UnitPriceDiscount" Type="money" Nullable="false" />
  </EntityType>
  <EntityType Name="SalesOrderHeader">
    <Key>
      <PropertyRef Name="SalesOrderID" />
    </Key>
    <Property Name="SalesOrderID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
    <Property Name="OrderDate" Type="datetime" Nullable="false" />
    <Property Name="DueDate" Type="datetime" Nullable="false" />
    <Property Name="ShipDate" Type="datetime" />
    <Property Name="Status" Type="tinyint" Nullable="false" />
    <Property Name="SalesOrderNumber" Type="nvarchar" Nullable="false" StoreGeneratedPattern="Computed" MaxLength="25" />
    <Property Name="PurchaseOrderNumber" Type="nvarchar" MaxLength="25" />
    <Property Name="AccountNumber" Type="nvarchar" MaxLength="15" />
    <Property Name="CustomerID" Type="int" Nullable="false" />
    <Property Name="SubTotal" Type="money" Nullable="false" />
    <Property Name="TaxAmt" Type="money" Nullable="false" />
    <Property Name="Freight" Type="money" Nullable="false" />
    <Property Name="Comment" Type="nvarchar" MaxLength="128" />
  </EntityType>
  <Association Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
    <End Role="SalesOrderHeader" Type="Microsoft.Samples.Edm.Store.SalesOrderHeader" Multiplicity="1" />
    <End Role="SalesOrderDetail" Type="Microsoft.Samples.Edm.Store.SalesOrderDetail" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="SalesOrderHeader">
        <PropertyRef Name="SalesOrderID" />
      </Principal>
      <Dependent Role="SalesOrderDetail">
        <PropertyRef Name="SalesOrderID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
</Schema>

Siehe auch

Konzepte

Anpassen von Objekten (Entity Framework)

Weitere Ressourcen

Schemas und Mappingspezifikation (Entity Framework)
Arbeiten mit benutzerdefinierten Objekten (Entity Framework-Aufgaben)