Asignar un modelo conceptual a un esquema de almacenamiento

Entity Framework proporciona una vista centrada en el objeto de datos tabulares, expresados como tipos de entidad. Los programadores de aplicaciones sólo tienen que dedicarse a programar con el modelo de objetos generado a partir del modelo conceptual, en lugar de tener que pensar también en el esquema de base de datos y en la forma de obtener acceso a objetos de base de datos y transformarlos en objetos de programación. Entity Framework utiliza esquemas y asignaciones de modelo para transformar, crear, leer, actualizar y eliminar operaciones con entidades en operaciones equivalentes del origen de datos.

Nota

Todos los fragmentos del archivo de asignación que se muestran en esta sección los genera la herramienta Generador de EDM (EdmGen.exe).

Modelo conceptual

El modelo conceptual es un esquema de Entity Data Model EDM que define las entidades y asociaciones en EDM. La sintaxis XML que define este modelo se denomina lenguaje de definición de esquemas conceptuales (CSDL). Cada uno de los tipos de entidad definidos en CSDL tiene un nombre, una clave para identificar de forma única instancias, y un conjunto de propiedades. Los tipos de datos asignados a propiedades se especifican como tipos simples, que son las propiedades escalares, o como tipos complejos, que son tipos que están compuestos de una o más propiedades escalares o complejas. Otras propiedades adicionales también pueden especificar la posibilidad de aceptar NULL o asignar un valor predeterminado. Las asociaciones definen las relaciones entre entidades. Los elementos de lenguaje y la terminología de Entity Framework se explican con más detalle en Terminología de Entity Framework.

El fragmento XML siguiente representa parte del modelo conceptual para el modelo EDM School que define los tipos de entidad Department y Course que están relacionados por la asociación FK_Course_Department, habiéndose quitado otras entidades y asociaciones.

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel" Alias="Self" 
  xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
  <EntityContainer Name="SchoolEntities">
    <EntitySet Name="Course" EntityType="SchoolModel.Course" />
    <EntitySet Name="Department" EntityType="SchoolModel.Department" />
    ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.FK_Course_Department">
      <End Role="Department" EntitySet="Department" />
      <End Role="Course" EntitySet="Course" />
    </AssociationSet>
    ...
  </EntityContainer>
  <EntityType Name="Course">
    <Key>
      <PropertyRef Name="CourseID" />
    </Key>
    <Property Name="CourseID" Type="Int32" Nullable="false" />
    <Property Name="Title" Type="String" Nullable="false" 
      MaxLength="100" Unicode="true" FixedLength="false" />
    ...
    <NavigationProperty Name="Department" 
      Relationship="SchoolModel.FK_Course_Department" 
      FromRole="Course" ToRole="Department" />
    ...
  </EntityType>
  <EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="Int32" Nullable="false" />
    <Property Name="Name" Type="String" Nullable="false" MaxLength="50" 
      Unicode="true" FixedLength="false" />
    ...
    <NavigationProperty Name="Course" Relationship="SchoolModel.FK_Course_Department" 
      FromRole="Department" ToRole="Course" />
  </EntityType>
  ...
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Department" Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Course" Multiplicity="*" />
  </Association>
  ...
</Schema>

Modelo de almacenamiento

Un modelo de datos independiente utiliza el lenguaje de definición de esquemas de almacenamiento (SSDL) para describir el modelo lógico para los datos persistentes, normalmente almacenado en una base de datos relacional. Los tipos de datos de las propiedades declaradas en archivos SSDL son los del modelo de almacenamiento. Este fragmento de modelo de almacenamiento muestra un ejemplo de metadatos de almacenamiento para las tablas Course y Department en la base de datos School que están relacionadas por la clave externa FK_Course_Department, habiéndose quitado otras entidades.

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel.Store" Alias="Self" 
  Provider="System.Data.SqlClient" ProviderManifestToken="2005"   xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"   xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
  <EntityContainer Name="dbo">
    <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" 
      store:Type="Tables" /> 
    <EntitySet Name="Department" 
      EntityType="SchoolModel.Store.Department" store:Type="Tables" />
     ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.Store.FK_Course_Department">
      <End Role="Department" EntitySet="Department" />
      <End Role="Course" EntitySet="Course" />
    </AssociationSet>
    ...
  </EntityContainer>
  <EntityType Name="Course">
    <Key>
      <PropertyRef Name="CourseID" />
    </Key>
    <Property Name="CourseID" Type="int" Nullable="false" />
    <Property Name="Title" Type="nvarchar" Nullable="false" 
      MaxLength="100" />
    ...
  </EntityType>
  <EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="int" Nullable="false" />
    <Property Name="Name" Type="nvarchar" Nullable="false" 
      MaxLength="50" />
    ...
  </EntityType>
  ...
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Store.Department" 
      Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Store.Course" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="Department">
        <PropertyRef Name="DepartmentID" />
      </Principal>
      <Dependent Role="Course">
        <PropertyRef Name="CourseID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
  ...
</Schema>

Especificación de asignaciones

Una especificación de asignaciones utiliza el lenguaje de especificación de asignaciones (MSL) para conectar los tipos declarados en el modelo conceptual con los metadatos de base de datos declarados en el modelo de almacenamiento. Este fragmento de MSL muestra una asignación unívoca entre los modelos conceptual y de almacenamiento para las entidades Department y Course en el modelo School.

<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S" 
  xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
  <EntityContainerMapping StorageEntityContainer="dbo" 
    CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Course">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Course)">
        <MappingFragment StoreEntitySet="Course">
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
          <ScalarProperty Name="Title" ColumnName="Title" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    <EntitySetMapping Name="Department">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Department)">
        <MappingFragment StoreEntitySet="Department">
         <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
          <ScalarProperty Name="Name" ColumnName="Name" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    ...
    <AssociationSetMapping Name="FK_Course_Department" 
      TypeName="SchoolModel.FK_Course_Department" 
      StoreEntitySet="Course">
      <EndProperty Name="Department">
        <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
      </EndProperty>
      <EndProperty Name="Course">
        <ScalarProperty Name="CourseID" ColumnName="CourseID" />
      </EndProperty>
      <Condition ColumnName="DepartmentID" IsNull="false" />
    </AssociationSetMapping>
    ...
  </cs:EntityContainerMapping>
</Mapping>

Análisis

El modelo School que se analiza aquí utiliza una asignación unívoca simple entre una entidad conceptual y una tabla de base de datos, pero Entity Framework admite asignaciones más complejas. Por ejemplo, la base de datos relacional puede utilizar más de una tabla para almacenar los datos relacionados con cada empleado. Una tabla puede contener información de contacto para todas las personas y una tabla relacionada independiente puede contener información perteneciente sólo a los empleados. Entity Framework permite a los programadores definir entidades mediante el uso de jerarquías de herencia y asignar una entidad a datos de más de una tabla en una base de datos, admitiendo totalmente actualizaciones, inserciones y eliminaciones de datos. Para obtener más información, vea Modelado de datos en Entity Framework.

Vea también

Conceptos

Terminología de Entity Framework

Otros recursos

Introducción (Entity Framework)
Especificaciones del EDM
Definir modelos de datos avanzados (tareas de Entity Framework)
Especificación de asignaciones y esquemas (Entity Framework)