Cómo: Personalizar archivos de asignación y modelado para trabajar con objetos personalizados (Entity Framework)

Para utilizar clases de datos personalizadas con Entity Framework , debe hacer coincidir los tipos de entidad y las propiedades definidas en el modelo conceptual para las clases de datos personalizadas. Cuando utilice las herramientas de Entity Data Model para generar el modelo y el contenido de asignación desde una base de datos, los tipos de entidad y los conjuntos de entidades del modelo conceptual coinciden con las tablas de la base de datos. Para actualizar el modelo y el contenido de asignación con el fin de coincidir con las clases de datos personalizadas, debe seguir estos pasos:

  1. Actualice el contenido del modelo conceptual, definido en lenguaje de definición de esquemas conceptuales (CSDL), para coincidir con las clases de datos personalizadas.

  2. Actualice el contenido del modelo de almacenamiento, definido en lenguaje de la definición de esquema de almacenamiento (SSDL), si es necesario.

  3. Actualice el contenido de asignación, definido en lenguaje de especificación de asignaciones (MSL).

  4. Valide el modelo actualizado y el contenido de asignación.

  5. Evite que Visual Studio genere la capa de objetos.

Bb738625.note(es-es,VS.100).gifNota:
Las herramientas de Entity Data Model también pueden generar los scripts que crean una nueva base de datos basándose en el contenido de la definición de esquema de almacenamiento (SSDL).En este caso, puede crear un modelo de datos que coincida con sus clases de datos personalizadas y, a continuación, crear una nueva base de datos basada en el archivo .edmx.Para obtener más información, vea How to: Create a Database from a Conceptual Model.

En este tema se muestra cómo actualizar el modelo utilizando ADO.NET Entity Data Model Designer (Entity Designer) o la utilidad Generador de EDM (EdmGen.exe). Para ejecutar los ejemplos de este tema, debe de haber generado ya su modelo. El modelo de este ejemplo está basado en las tablas Contact, SalesOrderHeader y SalesOrderDetail de la base de datos AdventureWorks. Para obtener información sobre cómo crear un nuevo modelo, vea Cómo usar el Asistente para Entity Data Model (Entity Framework) o Cómo: Usar EdmGen.exe para generar los archivos de asignación y de modelo. También debe agregar las clases de datos personalizadas Contact, Orders y LineItem que se asignan a las tablas Contact, SalesOrderHeadery SalesOrderDetail a su proyecto. Para definir las clases de datos personalizadas Contact, Orders y LineItem, vea Cómo: Definir entidades POCO (Entity Framework).

En los procedimientos siguientes se supone que tiene el archivo .edmx abierto en Entity Designer.

Modificar el modelo utilizando Entity Data Model Designer.

  1. Cambie el nombre de los elementos EntityType y EntitySet para reflejar los nombres de las clases de datos personalizadas.

    • Seleccione la entidad Contact. En la ventana Propiedades, establezca Nombre del conjunto de entidades en ContactSet.

    • Seleccione la entidad SalesOrderHeader. En la ventana Propiedades, establezca Nombre en Order y Nombre del conjunto de entidades en OrderSet.

    • Seleccione SalesOrderDetails. En la ventana Propiedades, establezca Nombre en LineItem y Entity Set Name en LineItemSet.

  2. Cambie el nombre de las propiedades de navegación.

    • Seleccione la propiedad de navegación SalesOrderHeaders de la entidad Contact. En la ventana Propiedades, establezca Nombre en Orders.

    • Seleccione la propiedad de navegación SalesOrderDetails de la entidad SalesOrderHeader. En la ventana Propiedades, establezca Nombre en LineItems.

    • Seleccione la propiedad de navegación SalesOrderHeader de la entidad SalesOrderDetail. En la ventana Propiedades, establezca Nombre en Order.

  3. Cambie la asociación.

    • Seleccione la asociación entre los tipos de entidad Client y Order, y modifique las siguientes propiedades para que coincidan con los siguientes valores en la ventana Propiedades:

      Nombre del conjunto de asociaciones: Order_ Contact_ ContactIDSet

      Propiedad de navegación de End1: Orders

      Nombre de rol de End1: Contact

      Propiedad de navegación de End2: Contact

      Nombre de rol de End2: Order

      Nombre: Order_Contact_ContactID

    • Seleccione la asociación entre los tipos de entidad Order y LineItem, y modifique las siguientes propiedades para que coincidan con los siguientes valores de la ventana Propiedades:

      Nombre del conjunto de asociaciones: LineItem_Order_SalesOrderIDSet

      Propiedad de navegación de End1: LineItems

      Nombre de rol de End1: Order

      Propiedad de navegación de End2: Order

      Nombre de rol de End2: LineItem

      Nombre: LineItem_Order_SalesOrderID

  4. Cree un tipo complejo a partir de las propiedades del tipo de entidad Order.

    • Seleccione las siguientes propiedades de la entidad Order: AccountNumber, Comment, PurchaseOrderNumber y SalesOrderNumber y, a continuación, haga clic con el botón secundario y seleccione Crear tipo complejo.

      Se agrega un nuevo tipo complejo con las propiedades seleccionadas en el Explorador de modelos. Se agrega a la entidad SalesOrderHeader una nueva propiedad de tipo complejo. Al tipo complejo y la propiedad de tipo complejo se le asignan nombres predeterminados.

    • Cambie el nombre del tipo complejo a OrderInfo.

    • Cambie el nombre de la propiedad de tipo complejo a ExtendedInfo.

  5. Guarde los cambios en el archivo .edmx.

  6. Deshabilite la generación de código para el archivo .edmx. Abra el archivo .edmx en ADO.NET Entity Data Model Designer (Entity Designer). Haga clic con el botón secundario en la superficie del diseñador y seleccione Propiedades. En la ventana Propiedades, seleccione la propiedad Estrategia de generación de código y haga clic en None. Si la ventana Propiedades no está visible, presione F4.

Modifique el modelo utilizando EdmGen.exe.

  1. Abra el archivo CSDL en Visual Studio o en un editor de texto.

    • Cambie el nombre de los elementos EntityType y EntitySet para reflejar los nombres de las clases de datos personalizadas.

    • Cambie el nombre de los elementos Property de cada tipo para que coincida con el nombre de las propiedades en la clase de datos personalizada.

    • Quite los elementos Property de las propiedades que no existan en la clase de datos personalizada.

    • Cambie el nombre del elemento NavigationProperty para que coincida con el de las propiedades de navegación en la clase de datos personalizada. Asegurarse de que FromRole y ToRole apuntan a los tipos de entidad correctos.

    • Guarde los cambios en el archivo .csdl.

  2. Abra el archivo MSL en Visual Studio o en un editor de texto.

    • Cambie el nombre del elemento EntitySetMapping y del atributo TypeName para reflejar los nombres de las clases personalizadas.

    • Quite el elemento EntitySetMapping de las entidades que no tengan una clase de datos personalizada correspondiente.

    • Cambie el nombre de los elementos ScalarProperty de cada tipo para que coincida con el de las propiedades en la clase de datos personalizada.

    • Quite el elemento ScalarProperty de las propiedades que no existan en la clase de datos personalizada.

    • Guarde los cambios en el archivo .msl.

  3. Abra el archivo SSDL en Visual Studio o en un editor de texto.

    • Quite los elementos EntityType de las entidades que no estén asignadas a clases de datos personalizadas.

    • Quite los elementos ScalarProperty de las propiedades que no estén asignadas a propiedades de clases de datos personalizadas.

    • Guarde los cambios en el archivo .ssdl.

  4. Valide los archivos de asignación ejecutando la utilidad EdmGen.exe en el directorio que contiene los archivos de asignación.

    • Use el siguiente comando:

      %windir%\Microsoft.NET\Framework\v4\edmgen.exe /mode:ValidateArtifacts  
      /inssdl:.  \YourModel.ssdl /inmsl:.  \YourModel.msl /incsdl:.  \YourModel.csdl  
      
    Bb738625.note(es-es,VS.100).gifNota:
    Quite los saltos de línea y reemplace suModelo por el nombre que se use para los archivos de asignaciones.

    • Revise la salida y repare los errores de validación.
  5. Compile, guarde y quite el código de objetos generados automáticamente.

    • En el Explorador de soluciones de Visual Studio, haga clic con el botón secundario en el archivo .csdl ** y seleccione Ejecutar herramienta personalizada.

    • De este modo se vuelve a compilar el nivel de objetos según el archivo .csdl modificado.

    • Expanda el nodo del archivo .csdl, abra el archivo del diseñador y guárdelo con un nombre diferente.

      De este modo se guarda el archivo del nivel de objetos generado automáticamente. El código de este archivo se utiliza en el tema Cómo: Definir un contexto del objeto personalizado (Entity Framework).

    • Excluya el archivo del diseñador del proyecto.

    • Seleccione el archivo .csdl y borre el valor Custom Tool en la ventana Propiedades.

      De este modo se impide que el archivo del nivel de objetos se regenere. Para generar este archivo en el futuro, escriba EntityModelCodeGenerator para Custom Tool en la ventana Propiedades y repita el paso 1.

Ejemplo

El siguiente archivo .csdl se ha personalizado para que sea compatible con las clases de datos personalizadas Contact, Orders y 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>

El siguiente archivo .msl se ha personalizado para asignar las clases de datos personalizadas Contact, Orders y LineItem a las tablas Contact, SalesOrderHeader y SalesOrderDetail de la base de datos 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>

El siguiente archivo .ssdl se ha personalizado para que sea compatible con las clases de datos personalizadas Contact, Orders y LineItem usando las tablas Contact, SalesOrderHeader y SalesOrderDetail de la base de datos 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>

Vea también

Conceptos

Personalizar objetos (Entity Framework)

Otros recursos

Especificaciones CSDL, SSDL y MSL