Compartir a través de


Esquemas EDM

Un esquema del Entity Data Model (EDM) es un archivo de texto XML que describe los tipos de relaciones y entidades. El esquema también define un contenedor en el que las instancias de estos tipos se organizan de forma lógica. Las entidades y asociaciones del EDM definen tanto los tipos básicos que se instalan con Entity Framework como los tipos que diseñan los programadores.

Un esquema de diseño se escribe en el lenguaje de definición de esquemas conceptuales (CSDL, Conceptual Schema Definition Language). Un segundo esquema escrito en el lenguaje de definición de esquemas de almacenamiento (SSDL, Store Schema Definition Language) define el modelo de almacenamiento para una aplicación que usa el EDM.

En este tema se describen los esquemas de diseño que se escriben en el CSDL. Para obtener más información acerca de los metadatos de almacenamiento y la asignación de los esquemas, vea Especificación de asignaciones y esquemas (Entity Framework).

El elemento de nivel superior de un esquema asigna un espacio de nombres dentro del cual se aplican las reglas con nombres únicos. Los tipos definidos en el siguiente esquema abreviado están organizados lógicamente debajo del espacio de nombres MyCompany.LOBSchema. Este espacio de nombres se parece a un espacio de nombres de la programación orientada a objetos que contiene clases y código de procedimientos. El EDM no define procedimientos. Para obtener información acerca cómo implementar procedimientos en el EDM, vea Métodos auxiliares (EDM).

Cada entidad y asociación definida en el esquema siguiente tiene un nombre completo, como MyCompany.LOBSchema.Customer. Los nombres completos se abrevian en el ejemplo usando el alias Self declarado para el espacio de nombres MyCompany.LOBSchema, como en el Self.Customer de uso.

Las entidades y asociaciones se definen en el esquema. Las propiedades de las entidades que se definen en este ejemplo se omiten para mostrar la estructura general de un esquema CSDL.

<?xml version="1.0" encoding="utf-8"?>
<Schema xmlns="https://schemas.microsoft.com/ado/2006/04/edm" 
        Namespace="MyCompany.LOBSchema" Alias="Self">

    <Documentation>
      <Summary>Conceptual schema (csdl)</Summary>
      <LongDescription>This schema is an example showing 
        general syntax.</LongDescription>
    </Documentation>

    <EntityType Name="Customer">
        <Key>
            <PropertyRef Name="CustomerId" />
        </Key>
        <Property Name="CustomerId" Type="Guid" Nullable="false" />
        <!-- Other properties-->
    </EntityType>

    <EntityType Name="Order">
        <Key>
            <PropertyRef Name="OrderId" />
        </Key>
        <Property Name="OrderId" Type="Guid" Nullable="false" />
        <!-- Other properties-->
    </EntityType>

    <Association Name="Customer_Order">
        <End Role="Customer" Type="Self.Customer" Multiplicity="0..1" />
        <End Role="Order" Type="Self.Order" Multiplicity="*" />
    </Association>

    <EntityContainer Name="LOBSchemaData">
        <EntitySet Name="Customers" EntityType="Self.Customer" />
        <EntitySet Name="Orders" EntityType="Self.Order" />
        <AssociationSet Name="Customer_Orders" Association="Self.Customer_Order">
            <End Role="Customer" EntitySet="Customers" />
            <End Role="Order" EntitySet="Orders" />
        </AssociationSet>
    </EntityContainer>
</Schema>

Con la etiqueta Using se puede definir un alias para un esquema definido en otro archivo CSDL, de modo que los tipos existentes en los esquemas externos se puedan usar en el espacio de nombres que se define sin sintaxis completa.

En los esquemas completos, las declaraciones de entidades incluyen propiedades. Una de las propiedades se designa como propiedad Key. El atributo Key de un EntityType especifica una o varias propiedades de la entidad como la clave. La clave puede estar compuesta de una o varias propiedades. La clave identifica de forma única las instancias de una entidad para todas las operaciones.

Dentro de la etiqueta EntityType de apertura del ejemplo siguiente, una vez que el atributo Name se asigna para la entidad, el atributo Key se asigna a CustomerId. El atributo Type de la propiedad KeyCustomerId se establece en Guid para especificar un valor único para la clave. La declaración de la propiedad CustomerId sigue en la línea segunda de este segmento de CSDL.

    <EntityType Name="Customer" >
        <Key>
            <PropertyRef Name="CustomerId" />
        </Key>
        <Property Name="CustomerId" Type="Guid" Nullable="false" />
        <Property Name="Title" Type="String" Nullable="false" />
    </EntityType>

En la última línea del ejemplo se declara una propiedad denominada Title y asigna el tipo de la propiedad Title como String. La propiedad Title identifica la función del cliente. La propiedad Title no puede ser Null, como especifica la restricción Nullability="false". El atributo Default del tipo String de la propiedad Title se establece en "NewHire".

Una clave compuesta se puede especificar según se muestra en el siguiente ejemplo.

<EntityType Name="EmployeePayHistory">
    <Key>
      <PropertyRef Name="EmployeeID" />
      <PropertyRef Name="RateChangeDate" />
    </Key>
    <Property Name="EmployeeID" Type="Int32" Nullable="false" />
    <Property Name="RateChangeDate" Type="DateTime" Nullable="false"/>
    <Property Name="Rate" Type="Decimal" Nullable="false"/>
    <Property Name="PayFrequency" Type="Boolean" Nullable="false" />
    <Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
    <NavigationProperty Name="Employee"
Relationship="Adventureworks.FK_EmployeePayHistory_Employee_EmployeeID"
 FromRole="EmployeePayHistory" ToRole="Employee" />
  </EntityType>

Contenedor de entidades

Los esquemas que usan el EDM definen un contenedor de entidades para especificar los conjuntos de tipos de datos que estarán disponibles en el espacio de nombres que se define. El contenedor de entidades es el fundamento de los espacios de nombres en el modelo de objetos programables que se crearán a partir del esquema de CSDL.

En la jerarquía XML, el elemento EntityContainer es independiente del elemento Schema, aunque EntityContainer esté definido en un esquema. Esto es importante al asignar el EntityContainer para el almacenamiento. Las etiquetasde EntityContainer en el esquema conceptual se asignan a las etiquetas EntityContainer correspondientes en los metadatos de almacenamiento. Observe que, en el archivo de asignación, el nombre completo del EntityContainer no incluye el nombre del espacio de nombres del esquema.

Los conjuntos de entidades modelan las clases del modelo de objetos programables. Los conjuntos de asociaciones definen el ámbito de las relaciones. Para obtener más información de los conjuntos de asociaciones y de entidades, vea Conjuntos de entidades (EDM) y Conjuntos de asociaciones (EDM).

El segmento del esquema siguiente contiene la declaración de EntityContainer para el espacio de nombres LOBSchemaData en el espacio de nombres MyCompany.LOBSchema.

    <EntityContainer Name="LOBSchemaData">
        <EntitySet Name="Customers" EntityType="Self.Customer"/>
        <EntitySet Name="Orders" EntityType="Self.Order"/>
        <AssociationSet Name="Customer_Orders" 
                          Association="Self.Customer_Order">
            <End Role="Customer" EntitySet="Customers"/>
            <End Role="Order" EntitySet="Orders"/>
        </AssociationSet>
    </EntityContainer>

Esta declaración de EntityContainer incluye todas las entidades y asociaciones definidas en los segmentos de código anteriores, ahora en forma de conjuntos especificados mediante las etiquetas EntitySet y AssociationSet.

Cuando las especificaciones de este esquema se implementan como tipos de datos, cada instancia de Customer o Order será un miembro del EntitySet apropiado. Este contenedor de entidades define conjuntos de entidades Customer y Order denominadas en plural: Customers y Orders. Los programadores pueden definir sus propias convenciones de nomenclatura. Para obtener más información sobre cómo se corresponden los nombres con los de la especificación de asignaciones y metadatos de almacenamiento, vea Especificación de asignaciones y esquemas (Entity Framework).

Las etiquetas AssociationSet en la declaración EntityContainer anterior especifican un conjunto de asociaciones denominado Customer_Orders. Este conjunto de asociaciones contiene instancias de la asociación Customer_Order.

Estos elementos (EntityType, EntitySet, Association, AssociationSet y EntityContainer) se combinan para formar la estructura básica de un esquema. Para obtener más información línea a línea acerca de las declaraciones en los esquemas, vea Especificación de asignaciones y esquemas (Entity Framework).

Implementación

La especificación del EDM no dicta el modelo de almacenamiento que se usa una vez definidos los tipos de entidad en CSDL. En el escenario más común, el origen de datos es un sistema de administración de bases de datos relacionales (RDBMS). La implementación del modelo de almacenamiento requiere la creación de una base de datos y tablas que se corresponden con las entidades definidas en el esquema. La implementación también puede requerir claves externas en las tablas de datos y/o en las tablas de vínculos para admitir asociaciones.

El EDM se puede usar con una base de datos existente si se asigna la base de datos y las tablas a los tipos del EDM. Los modelos de objetos de programación existentes también se pueden asignar a tipos del EDM.

Vea también

Conceptos

Relaciones del Entity Data Model
Tipos del Entity Data Model
Elemento EntityType (CSDL)
Elemento EntitySet (EntityContainer CSDL)
Elemento Association (CSDL)
Elemento AssociationSet (CSDL EntityContainer)
Elemento EntityContainer (CSDL)

Otros recursos

Especificación de asignaciones y esquemas (Entity Framework)