Condividi tramite


Procedura: personalizzare i file di mapping e di modellazione per l'utilizzo con oggetti personalizzati (Entity Framework)

Per utilizzare le classi di dati personalizzate con Entity Framework , è necessario farle corrispondere ai tipi di entità e alle proprietà che sono definiti nel modello concettuale. Quando si utilizzano gli strumenti Entity Data Model per generare il contenuto del modello e del mapping da un database, i tipi di entità e i set di entità nel modello concettuale corrispondono alle tabelle nel database. Per aggiornare il contenuto del modello e del mapping in modo che corrisponda alle classi di dati personalizzate, è necessario eseguire i passaggi seguenti:

  1. Aggiornare il contenuto del modello concettuale, definito in Conceptual Schema Definition Language (CSDL) in modo da creare la corrispondenza con le classi di dati personalizzate.

  2. Se necessario, aggiornare il contenuto del modello di archiviazione, definito in Store Schema Definition Language (SSDL).

  3. Aggiornare il contenuto del mapping, il quale è definito in Mapping Specification Language (MSL).

  4. Convalidare il contenuto aggiornato del modello e del mapping.

  5. Evitare che in Visual Studio venga generato il livello di oggetti.

Bb738625.note(it-it,VS.100).gifNota:
Gli strumenti Entity Data Model consentono inoltre di generare script che creano un nuovo database sulla base del contenuto SSDL (Storage Schema Definition Language).In questo caso, è possibile creare un modello di dati che corrisponda alle classi di dati personalizzate, quindi creare un nuovo database basato sul file .edmx.Per ulteriori informazioni, vedere How to: Create a Database from a Conceptual Model.

In questo argomento viene mostrato come aggiornare il modello tramite ADO.NET Entity Data Model Designer (Entity Designer) o l'utilità Generatore EDM (EdmGen.exe) Per eseguire gli esempi in questo argomento, è necessario avere già generato il modello. Il modello in questo esempio è basato sulle tabelle Contact, SalesOrderHeader e SalesOrderDetail del database AdventureWorks. Per informazioni su come creare un nuovo modello, vedere Procedura: utilizzare la procedura guidata Entity Data Model (Entity Framework) o Procedura: utilizzare EdmGen.exe per generare i file di modello e di mapping. È necessario aggiungere al progetto le classi di dati personalizzate Contact, Orders e LineItem che eseguono il mapping alle tabelle Contact, SalesOrderHeader e SalesOrderDetail. Per definire le classi di dati personalizzate Contact, Orders e LineItem, vedere Procedura: definire entità POCO (Entity Framework).

Nelle procedure riportate di seguito si presuppone che il file .edmx sia aperto in Entity Designer.

Modificare il modello utilizzando Entity Data Model Designer.

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

    • Selezionare l'entità Contact. Nella finestra Proprietà impostare Nome set entità su ContactSet.

    • Selezionare l'entità SalesOrderHeader. Nella finestra Proprietà impostare Nome su Order e Nome set entità su OrderSet.

    • Selezionare SalesOrderDetails. Nella finestra Proprietà impostare Nome su LineItem e Entity Set Name su LineItemSet.

  2. Modificare il nome delle proprietà di navigazione.

    • Selezionare la proprietà di navigazione SalesOrderHeaders dell'entità Contact. Nella finestra Proprietà impostare Nome su Orders.

    • Selezionare la proprietà di navigazione SalesOrderDetails dell'entità SalesOrderHeader. Nella finestra Proprietà impostare Nome su LineItems.

    • Selezionare la proprietà di navigazione SalesOrderHeader dell'entità SalesOrderDetail. Nella finestra Proprietà impostare Nome su Order.

  3. Modificare l'associazione.

    • Selezionare l'associazione tra i tipi di entità Client e Order e modificare le proprietà seguenti per far corrispondere i valori seguenti nella finestra Proprietà:

      Nome set di associazioni: Order_ Contact_ ContactIDSet

      Proprietà di navigazione End1: Orders

      Nome ruolo End1: Contact

      Proprietà di navigazione End2: Contact

      Nome ruolo End2: Order

      Nome: Order_Contact_ContactID

    • Selezionare l'associazione tra i tipi di entità Order e LineItem e modificare le proprietà seguenti per far corrispondere i valori seguenti nella finestra Proprietà:

      Nome set di associazioni: LineItem_Order_SalesOrderIDSet

      Proprietà di navigazione End1: LineItems

      Nome ruolo End1: Order

      Proprietà di navigazione End2: Order

      Nome ruolo End2: LineItem

      Nome: LineItem_Order_SalesOrderID

  4. Creare un tipo complesso dalle proprietà del tipo di entità Order.

    • Selezionare le seguenti proprietà dell'entità Order: AccountNumber, Comment, PurchaseOrderNumber e SalesOrderNumber, quindi fare clic con il pulsante destro del mouse e selezionare Crea tipo complesso.

      Nella finestra Browser modello verrà aggiunto un nuovo tipo complesso con le proprietà selezionate. Verrà aggiunta una nuova proprietà del tipo complesso all'entità SalesOrderHeader. Al tipo complesso e alla proprietà del tipo complesso sono assegnati nomi predefiniti.

    • Rinominare il tipo complesso in OrderInfo.

    • Rinominare la proprietà di tipo complesso in ExtendedInfo.

  5. Salvare le modifiche apportate al file con estensione edmx.

  6. Disabilitare la generazione di codice per il file con estensione edmx. Aprire il file con estensione edmx in ADO.NET Entity Data Model Designer (Entity Designer). Fare clic con il pulsante destro del mouse nell'area di progettazione e scegliere Proprietà. Nella finestra Proprietà selezionare la proprietà Strategia di generazione del codice e quindi None. Se la finestra Proprietà non viene visualizzata, premere F4.

Modificare il modello utilizzando EdmGen.exe.

  1. Aprire il file CSDL in Visual Studio o in un editor di testo.

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

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

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

    • Rinominare l'elemento NavigationProperty perché corrisponda al nome della proprietà di navigazione nella classe di dati personalizzata. Assicurarsi che FromRole e ToRole puntino ai tipi di entità corretti.

    • Salvare le modifiche apportate al file .csdl.

  2. Aprire il file MSL in Visual Studio o in un editor di testo.

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

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

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

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

    • Salvare le modifiche apportate al file .msl.

  3. Aprire il file SSDL in Visual Studio o in un editor di testo.

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

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

    • Salvare le modifiche apportate al file .ssdl.

  4. Convalidare i file di mapping aggiornati eseguendo l'utilità EdmGen.exe nella directory che contiene i file di mapping.

    • Utilizzare il seguente comando:

      %windir%\Microsoft.NET\Framework\v4\edmgen.exe /mode:ValidateArtifacts  
      /inssdl:.  \YourModel.ssdl /inmsl:.  \YourModel.msl /incsdl:.  \YourModel.csdl  
      
    Bb738625.note(it-it,VS.100).gifNota:
    Rimuovere le interruzioni di riga e sostituire YourModel con il nome utilizzato per i file di mapping.

    • Esaminare l'output e correggere eventuali errori di convalida.
  5. Rigenerare, salvare e rimuovere il codice dell'oggetto generato automaticamente.

    • In Esplora soluzioni in Visual Studio, fare clic con il pulsante destro del mouse sul file .csdl* *e selezionare Esegui strumento personalizzato.

    • Verrà generato il livello oggetti in base al file CSDL modificato.

    • Espandere il nodo del file CSDL, aprire il file della finestra di progettazione e salvarlo 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: definire un contesto dell'oggetto personalizzato (Entity Framework).

    • Escludere il file della finestra di progettazione dal progetto.

    • Selezionare il file CSDL e cancellare il valore di Strumento personalizzato nella finestra Proprietà.

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

Esempio

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

<Schema Namespace="AdventureWorksModel" Alias="Self" xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="https://schemas.microsoft.com/ado/2008/09/edm">
  <EntityContainer Name="AdventureWorksEntities" annotation:LazyLoadingEnabled="true">
    <EntitySet Name="LineItemSet" EntityType="AdventureWorksModel.LineItem" />
    <EntitySet Name="OrderSet" EntityType="AdventureWorksModel.Order" />
    <AssociationSet Name="LineItem_Order_SalesOrderIDSet" Association="AdventureWorksModel.LineItem_Order_SalesOrderID">
      <End Role="Order" EntitySet="OrderSet" />
      <End Role="LineItem" EntitySet="LineItemSet" />
    </AssociationSet>
  <EntitySet Name="ContactSet" EntityType="AdventureWorksModel.Contact" />
  <AssociationSet Name="Order_Contact_ContactID" Association="AdventureWorksModel.Order_Contact_ContactID">
  <End Role="Contact" EntitySet="ContactSet" />
  <End Role="Order" EntitySet="OrderSet" /></AssociationSet>
  </EntityContainer>
  <EntityType Name="LineItem">
    <Key>
      <PropertyRef Name="SalesOrderID" />
      <PropertyRef Name="SalesOrderDetailID" />
    </Key>
    <Property Name="SalesOrderID" Type="Int32" Nullable="false" />
    <Property Name="SalesOrderDetailID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
    <Property Name="CarrierTrackingNumber" Type="String" MaxLength="25" Unicode="true" FixedLength="false" />
    <Property Name="OrderQty" Type="Int16" Nullable="false" />
    <Property Name="ProductID" Type="Int32" Nullable="false" />
    <Property Name="SpecialOfferID" Type="Int32" Nullable="false" />
    <Property Name="UnitPrice" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="UnitPriceDiscount" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="LineTotal" Type="Decimal" Nullable="false" Precision="38" Scale="6" annotation:StoreGeneratedPattern="Computed" />
    <Property Name="rowguid" Type="Guid" Nullable="false" />
    <Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
    <NavigationProperty Name="Order" Relationship="AdventureWorksModel.LineItem_Order_SalesOrderID" FromRole="LineItem" ToRole="Order" />
  </EntityType>
  <EntityType Name="Order">
    <Key>
      <PropertyRef Name="SalesOrderID" />
    </Key>
    <Property Name="SalesOrderID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
    <Property Name="RevisionNumber" Type="Byte" 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="OnlineOrderFlag" Type="Boolean" Nullable="false" />
    <Property Name="CustomerID" Type="Int32" Nullable="false" />
    <Property Name="ContactID" Type="Int32" Nullable="false" />
    <Property Name="SalesPersonID" Type="Int32" />
    <Property Name="TerritoryID" Type="Int32" />
    <Property Name="BillToAddressID" Type="Int32" Nullable="false" />
    <Property Name="ShipToAddressID" Type="Int32" Nullable="false" />
    <Property Name="ShipMethodID" Type="Int32" Nullable="false" />
    <Property Name="CreditCardID" Type="Int32" />
    <Property Name="CreditCardApprovalCode" Type="String" MaxLength="15" Unicode="false" FixedLength="false" />
    <Property Name="CurrencyRateID" Type="Int32" />
    <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="TotalDue" Type="Decimal" Nullable="false" Precision="19" Scale="4" annotation:StoreGeneratedPattern="Computed" />
    <Property Name="rowguid" Type="Guid" Nullable="false" />
    <Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
    <NavigationProperty Name="LineItems" Relationship="AdventureWorksModel.LineItem_Order_SalesOrderID" FromRole="Order" ToRole="LineItem" />
    <Property Name="ExtendedInfo" Type="AdventureWorksModel.OrderInfo" Nullable="false" />
    <NavigationProperty Name="Contact" Relationship="AdventureWorksModel.Order_Contact_ContactID" FromRole="Order" ToRole="Contact" />
    </EntityType>
  <Association Name="LineItem_Order_SalesOrderID">
    <End Role="Order" Type="AdventureWorksModel.Order" Multiplicity="1">
      <OnDelete Action="Cascade" />
    </End>
    <End Role="LineItem" Type="AdventureWorksModel.LineItem" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="Order">
        <PropertyRef Name="SalesOrderID" />
      </Principal>
      <Dependent Role="LineItem">
        <PropertyRef Name="SalesOrderID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
  <ComplexType Name="OrderInfo">
  <Property Type="String" Name="Comment" MaxLength="128" FixedLength="false" Unicode="true" />
  <Property Type="String" Name="AccountNumber" MaxLength="15" FixedLength="false" Unicode="true" />
  <Property Type="String" Name="PurchaseOrderNumber" MaxLength="25" FixedLength="false" Unicode="true" />
  <Property Type="String" Name="SalesOrderNumber" Nullable="false" MaxLength="25" FixedLength="false" Unicode="true" /></ComplexType>
  <EntityType Name="Contact">
  <Key>
  <PropertyRef Name="ContactID" /></Key>
  <Property Type="Int32" Name="ContactID" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
  <Property Type="Boolean" Name="NameStyle" Nullable="false" />
  <Property Type="String" Name="Title" MaxLength="8" FixedLength="false" Unicode="true" />
  <Property Type="String" Name="FirstName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
  <Property Type="String" Name="MiddleName" MaxLength="50" FixedLength="false" Unicode="true" />
  <Property Type="String" Name="LastName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
  <Property Type="String" Name="Suffix" MaxLength="10" FixedLength="false" Unicode="true" />
  <Property Type="String" Name="EmailAddress" MaxLength="50" FixedLength="false" Unicode="true" />
  <Property Type="Int32" Name="EmailPromotion" Nullable="false" />
  <Property Type="String" Name="Phone" MaxLength="25" FixedLength="false" Unicode="true" />
  <Property Type="String" Name="PasswordHash" Nullable="false" MaxLength="128" FixedLength="false" Unicode="false" />
  <Property Type="String" Name="PasswordSalt" Nullable="false" MaxLength="10" FixedLength="false" Unicode="false" />
  <Property Type="String" Name="AdditionalContactInfo" MaxLength="Max" FixedLength="false" Unicode="true" />
  <Property Type="Guid" Name="rowguid" Nullable="false" />
  <Property Type="DateTime" Name="ModifiedDate" Nullable="false" />
  <NavigationProperty Name="Orders" Relationship="AdventureWorksModel.Order_Contact_ContactID" FromRole="Contact" ToRole="Order" /></EntityType>
  <Association Name="Order_Contact_ContactID">
  <End Type="AdventureWorksModel.Contact" Role="Contact" Multiplicity="1" />
  <End Type="AdventureWorksModel.Order" Role="Order" Multiplicity="*" />
  <ReferentialConstraint>
  <Principal Role="Contact">
  <PropertyRef Name="ContactID" /></Principal>
  <Dependent Role="Order">
  <PropertyRef Name="ContactID" /></Dependent></ReferentialConstraint></Association>
  </Schema>

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

<Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
  <EntityContainerMapping StorageEntityContainer="AdventureWorksModelStoreContainer" CdmEntityContainer="AdventureWorksEntities">
    <EntitySetMapping Name="LineItemSet">
      <EntityTypeMapping TypeName="AdventureWorksModel.LineItem">
        <MappingFragment StoreEntitySet="SalesOrderDetail">
          <ScalarProperty Name="SalesOrderID" ColumnName="SalesOrderID" />
          <ScalarProperty Name="SalesOrderDetailID" ColumnName="SalesOrderDetailID" />
          <ScalarProperty Name="CarrierTrackingNumber" ColumnName="CarrierTrackingNumber" />
          <ScalarProperty Name="OrderQty" ColumnName="OrderQty" />
          <ScalarProperty Name="ProductID" ColumnName="ProductID" />
          <ScalarProperty Name="SpecialOfferID" ColumnName="SpecialOfferID" />
          <ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" />
          <ScalarProperty Name="UnitPriceDiscount" ColumnName="UnitPriceDiscount" />
          <ScalarProperty Name="LineTotal" ColumnName="LineTotal" />
          <ScalarProperty Name="rowguid" ColumnName="rowguid" />
          <ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    <EntitySetMapping Name="OrderSet">
      <EntityTypeMapping TypeName="AdventureWorksModel.Order">
        <MappingFragment StoreEntitySet="SalesOrderHeader">
          <ScalarProperty Name="SalesOrderID" ColumnName="SalesOrderID" />
          <ScalarProperty Name="RevisionNumber" ColumnName="RevisionNumber" />
          <ScalarProperty Name="OrderDate" ColumnName="OrderDate" />
          <ScalarProperty Name="DueDate" ColumnName="DueDate" />
          <ScalarProperty Name="ShipDate" ColumnName="ShipDate" />
          <ScalarProperty Name="Status" ColumnName="Status" />
          <ScalarProperty Name="OnlineOrderFlag" ColumnName="OnlineOrderFlag" />
          <ScalarProperty Name="CustomerID" ColumnName="CustomerID" />
          <ScalarProperty Name="ContactID" ColumnName="ContactID" />
          <ScalarProperty Name="SalesPersonID" ColumnName="SalesPersonID" />
          <ScalarProperty Name="TerritoryID" ColumnName="TerritoryID" />
          <ScalarProperty Name="BillToAddressID" ColumnName="BillToAddressID" />
          <ScalarProperty Name="ShipToAddressID" ColumnName="ShipToAddressID" />
          <ScalarProperty Name="ShipMethodID" ColumnName="ShipMethodID" />
          <ScalarProperty Name="CreditCardID" ColumnName="CreditCardID" />
          <ScalarProperty Name="CreditCardApprovalCode" ColumnName="CreditCardApprovalCode" />
          <ScalarProperty Name="CurrencyRateID" ColumnName="CurrencyRateID" />
          <ScalarProperty Name="SubTotal" ColumnName="SubTotal" />
          <ScalarProperty Name="TaxAmt" ColumnName="TaxAmt" />
          <ScalarProperty Name="Freight" ColumnName="Freight" />
          <ScalarProperty Name="TotalDue" ColumnName="TotalDue" />
          <ScalarProperty Name="rowguid" ColumnName="rowguid" />
          <ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
          <ComplexProperty Name="ExtendedInfo">
            <ScalarProperty Name="SalesOrderNumber" ColumnName="SalesOrderNumber" />
            <ScalarProperty Name="PurchaseOrderNumber" ColumnName="PurchaseOrderNumber" />
            <ScalarProperty Name="AccountNumber" ColumnName="AccountNumber" />
            <ScalarProperty Name="Comment" ColumnName="Comment" />
          </ComplexProperty>
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
      <EntitySetMapping Name="ContactSet">
      <EntityTypeMapping TypeName="AdventureWorksModel.Contact">
      <MappingFragment StoreEntitySet="Contact">
      <ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
      <ScalarProperty Name="rowguid" ColumnName="rowguid" />
      <ScalarProperty Name="AdditionalContactInfo" ColumnName="AdditionalContactInfo" />
      <ScalarProperty Name="PasswordSalt" ColumnName="PasswordSalt" />
      <ScalarProperty Name="PasswordHash" ColumnName="PasswordHash" />
      <ScalarProperty Name="Phone" ColumnName="Phone" />
      <ScalarProperty Name="EmailPromotion" ColumnName="EmailPromotion" />
      <ScalarProperty Name="EmailAddress" ColumnName="EmailAddress" />
      <ScalarProperty Name="Suffix" ColumnName="Suffix" />
      <ScalarProperty Name="LastName" ColumnName="LastName" />
      <ScalarProperty Name="MiddleName" ColumnName="MiddleName" />
      <ScalarProperty Name="FirstName" ColumnName="FirstName" />
      <ScalarProperty Name="Title" ColumnName="Title" />
      <ScalarProperty Name="NameStyle" ColumnName="NameStyle" />
      <ScalarProperty Name="ContactID" ColumnName="ContactID" /></MappingFragment></EntityTypeMapping></EntitySetMapping>
  </EntityContainerMapping>
</Mapping>

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

<Schema Namespace="AdventureWorksModel.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="AdventureWorksModelStoreContainer">
      <EntitySet Name="Contact" EntityType="AdventureWorksModel.Store.Contact" store:Type="Tables" Schema="Person" />
      <EntitySet Name="SalesOrderDetail" EntityType="AdventureWorksModel.Store.SalesOrderDetail" store:Type="Tables" Schema="Sales" />
      <EntitySet Name="SalesOrderHeader" EntityType="AdventureWorksModel.Store.SalesOrderHeader" store:Type="Tables" Schema="Sales" />
      <AssociationSet Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID" Association="AdventureWorksModel.Store.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
        <End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
        <End Role="SalesOrderDetail" EntitySet="SalesOrderDetail" />
      </AssociationSet>
      <AssociationSet Name="FK_SalesOrderHeader_Contact_ContactID" Association="AdventureWorksModel.Store.FK_SalesOrderHeader_Contact_ContactID">
        <End Role="Contact" EntitySet="Contact" />
        <End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
      </AssociationSet>
    </EntityContainer>
    <EntityType Name="Contact">
      <Key>
        <PropertyRef Name="ContactID" />
      </Key>
      <Property Name="ContactID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="NameStyle" Type="bit" Nullable="false" />
      <Property Name="Title" Type="nvarchar" MaxLength="8" />
      <Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="50" />
      <Property Name="MiddleName" Type="nvarchar" MaxLength="50" />
      <Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
      <Property Name="Suffix" Type="nvarchar" MaxLength="10" />
      <Property Name="EmailAddress" Type="nvarchar" MaxLength="50" />
      <Property Name="EmailPromotion" Type="int" Nullable="false" />
      <Property Name="Phone" Type="nvarchar" MaxLength="25" />
      <Property Name="PasswordHash" Type="varchar" Nullable="false" MaxLength="128" />
      <Property Name="PasswordSalt" Type="varchar" Nullable="false" MaxLength="10" />
      <Property Name="AdditionalContactInfo" Type="xml" />
      <Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
      <Property Name="ModifiedDate" Type="datetime" Nullable="false" />
    </EntityType>
    <EntityType Name="SalesOrderDetail">
      <Key>
        <PropertyRef Name="SalesOrderID" />
        <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="SpecialOfferID" Type="int" Nullable="false" />
      <Property Name="UnitPrice" Type="money" Nullable="false" />
      <Property Name="UnitPriceDiscount" Type="money" Nullable="false" />
      <Property Name="LineTotal" Type="numeric" Nullable="false" Precision="38" Scale="6" StoreGeneratedPattern="Computed" />
      <Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
      <Property Name="ModifiedDate" Type="datetime" Nullable="false" />
    </EntityType>
    <EntityType Name="SalesOrderHeader">
      <Key>
        <PropertyRef Name="SalesOrderID" />
      </Key>
      <Property Name="SalesOrderID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="RevisionNumber" Type="tinyint" 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="tinyint" Nullable="false" />
      <Property Name="OnlineOrderFlag" Type="bit" Nullable="false" />
      <Property Name="SalesOrderNumber" Type="nvarchar" Nullable="false" MaxLength="25" StoreGeneratedPattern="Computed" />
      <Property Name="PurchaseOrderNumber" Type="nvarchar" MaxLength="25" />
      <Property Name="AccountNumber" Type="nvarchar" MaxLength="15" />
      <Property Name="CustomerID" Type="int" Nullable="false" />
      <Property Name="ContactID" Type="int" Nullable="false" />
      <Property Name="SalesPersonID" Type="int" />
      <Property Name="TerritoryID" Type="int" />
      <Property Name="BillToAddressID" Type="int" Nullable="false" />
      <Property Name="ShipToAddressID" Type="int" Nullable="false" />
      <Property Name="ShipMethodID" Type="int" Nullable="false" />
      <Property Name="CreditCardID" Type="int" />
      <Property Name="CreditCardApprovalCode" Type="varchar" MaxLength="15" />
      <Property Name="CurrencyRateID" Type="int" />
      <Property Name="SubTotal" Type="money" Nullable="false" />
      <Property Name="TaxAmt" Type="money" Nullable="false" />
      <Property Name="Freight" Type="money" Nullable="false" />
      <Property Name="TotalDue" Type="money" Nullable="false" StoreGeneratedPattern="Computed" />
      <Property Name="Comment" Type="nvarchar" MaxLength="128" />
      <Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
      <Property Name="ModifiedDate" Type="datetime" Nullable="false" />
    </EntityType>
    <Association Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
      <End Role="SalesOrderHeader" Type="AdventureWorksModel.Store.SalesOrderHeader" Multiplicity="1">
        <OnDelete Action="Cascade" />
      </End>
      <End Role="SalesOrderDetail" Type="AdventureWorksModel.Store.SalesOrderDetail" Multiplicity="*" />
      <ReferentialConstraint>
        <Principal Role="SalesOrderHeader">
          <PropertyRef Name="SalesOrderID" />
        </Principal>
        <Dependent Role="SalesOrderDetail">
          <PropertyRef Name="SalesOrderID" />
        </Dependent>
      </ReferentialConstraint>
    </Association>
    <Association Name="FK_SalesOrderHeader_Contact_ContactID">
      <End Role="Contact" Type="AdventureWorksModel.Store.Contact" Multiplicity="1" />
      <End Role="SalesOrderHeader" Type="AdventureWorksModel.Store.SalesOrderHeader" Multiplicity="*" />
      <ReferentialConstraint>
        <Principal Role="Contact">
          <PropertyRef Name="ContactID" />
        </Principal>
        <Dependent Role="SalesOrderHeader">
          <PropertyRef Name="ContactID" />
        </Dependent>
      </ReferentialConstraint>
    </Association>
  </Schema>

Vedere anche

Concetti

Personalizzazione di oggetti (Entity Framework)

Altre risorse

Specifiche CSDL, SSDL e MSL