Procedura: personalizzare un modello EDM per l'utilizzo con oggetti personalizzati (Entity Framework)

Se si desidera utilizzare classi di dati personalizzate con un modello EDM (Entity Data Model), le proprietà e i tipi di entità definiti nel file CSDL (Conceptual Schema Definition Language) devono corrispondere alle classi di dati personalizzate. Gli strumenti di Entity Framework generano un gruppo di file di mapping in cui i tipi di entità e i set di entità inclusi nel file CSDL corrispondono alle tabelle nel database. Il processo di aggiornamento di tali file di mapping per le classi di dati personalizzate è il seguente:

  1. Aggiornare il file CSDL affinché corrisponda alle classi di dati personalizzate.

  2. Aggiornare il mapping nel file MSL (Mapping Specification Language).

  3. Aggiornare il file SSDL (Store Schema Definition Language), se necessario.

  4. Convalidare i file di mapping aggiornati.

  5. Interrompere la generazione del livello di oggetti da parte di Visual Studio.

Per eseguire l'esempio incluso in questo argomento, è necessario avere già utilizzato l'utilità Generatore EDM (EdmGen.exe) o la Procedura guidata Entity Data Model per generare i file di mapping EDM. Per ulteriori informazioni, vedere Procedura: utilizzare EdmGen.exe per generare un modello EDM (Entity Framework). Se si utilizza Entity Data Model Designer in Visual Studio, è inoltre necessario disattivare la generazione del livello di oggetti basata sul file CSDL aggiornato. In caso contrario, saranno presenti classi di dati duplicate nel progetto.

Per aggiornare il file CSDL perché corrisponda agli oggetti dati personalizzati

  1. Aprire il file CSDL in Visual Studio o in notepad.exe.

  2. Rinominare gli elementi EntityType e EntitySet perché corrispondano ai nomi delle classi di dati personalizzate.

  3. Rimuovere gli elementi EntityType e EntitySet per qualsiasi entità per cui non è presente alcuna classe di dati personalizzata corrispondente.

  4. Rinominare gli elementi Property di ogni tipo perché corrispondano ai nomi delle proprietà nella classe di dati personalizzata.

  5. Rimuovere gli elementi Property per qualsiasi proprietà non presente nella classe di dati personalizzata.

  6. Salvare le modifiche apportate al file CSDL.

Per aggiornare il file MSL per il mapping degli oggetti dati personalizzati agli oggetti nell'origine dati

  1. Aprire il file MSL in Visual Studio o in notepad.exe.

  2. Rinominare l'elemento EntitySetMapping e l'attributo TypeName perché corrispondano ai nomi delle classi personalizzate.

  3. Rimuovere l'elemento EntitySetMapping per qualsiasi entità per cui non è presente alcuna classe di dati personalizzata corrispondente.

  4. Rinominare gli elementi ScalarProperty di ogni tipo perché corrispondano ai nomi delle proprietà nella classe di dati personalizzata.

  5. Rimuovere l'elemento ScalarProperty per qualsiasi proprietà non presente nella classe di dati personalizzata.

  6. Rinominare l'elemento EndProperty in AssociationSetMapping perché corrisponda ai nomi delle classi personalizzate.

  7. Rinominare gli elementi ScalarProperty in ogni elemento AssociationSetMapping perché corrispondano ai nomi delle proprietà nella classe di dati personalizzata.

    NoteNota

    Non modificare alcuna delle proprietà ColumnName.

  8. Rimuovere l'elemento AssociationSetMapping per le associazioni tra tutte le entità non presenti nelle classi di dati personalizzate.

  9. Salvare le modifiche apportate al file MSL.

Per aggiornare il file SSDL per la rimozione delle entità non presenti nelle classi di dati personalizzate

  1. Aprire il file SSDL in Visual Studio o in notepad.exe.

  2. Rimuovere gli elementi EntityType per qualsiasi entità non mappata alle classi di dati personalizzate.

  3. Rimuovere gli elementi ScalarProperty per qualsiasi proprietà non mappata alle proprietà delle classi di dati personalizzate.

  4. Salvare le modifiche apportate al file SSDL.

Per convalidare i file di mapping aggiornati

  1. Eseguire l'utilità EdmGen.exe nella directory che contiene i file di mapping. Utilizzare il seguente comando:

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

    Rimuovere le interruzione di riga e sostituire YourModel con il nome utilizzato per i file di mapping.

  2. Esaminare l'output e correggere eventuali errori di convalida.

Per rigenerare, salvare e rimuovere il codice oggetto generato automaticamente

  1. In Esplora soluzioni in Visual Studio fare clic con il pulsante destro del mouse sul file**CSDL, quindi scegliere Esegui strumento personalizzato.

    Il livello di oggetti verrà rigenerato in base al file CSDL modificato.

  2. Espandere il nodo del file CSDL, aprire il file della finestra di progettazione e salvare il file con un nome diverso.

    In questo modo, verrà salvato il file del livello di oggetti generato automaticamente. Il codice di questo file viene utilizzato nell'argomento Procedura: utilizzare Object Services con oggetti personalizzati (Entity Framework).

  3. Escludere il file della finestra di progettazione dal progetto.

  4. Selezionare il file CSDL e deselezionare il valore Strumento personalizzato nella finestra Proprietà.

    In questo modo, il file del livello di oggetti non verrà più rigenerato. Per generare questo file in seguito, digitare EntityModelCodeGenerator come valore di Strumento personalizzato nella finestra Proprietà e ripetere il passaggio 1.

Esempio

Il file CSDL seguente è stato personalizzato per supportare le classi di dati personalizzate Orders e LineItem.

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

Il file MSL seguente è stato personalizzato per consentire il mapping delle classi di dati personalizzate Orders e LineItem alle tabelle SalesOrderHeader e SalesOrderDetail nel database AdventureWorks.

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

Il file SSDL seguente è stato personalizzato per supportare le classi di dati personalizzate Orders e LineItem che utilizzano le tabelle SalesOrderHeader e SalesOrderDetail nel database AdventureWorks.

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

Vedere anche

Concetti

Personalizzazione di oggetti (Entity Framework)

Altre risorse

Specifica di schemi e mapping (Entity Framework)
Utilizzo di oggetti personalizzati (attività di Entity Framework)