Compartir a través de


Asignar un modelo conceptual a un modelo de almacenamiento

Entity Framework usa un modelo conceptual para proporcionar una vista de los datos centrada en objetos, expresados como tipos de entidad y asociaciones. Los desarrolladores de aplicaciones solo tienen que dedicarse a programar con las clases generadas a partir del modelo conceptual, en lugar de tener que pensar también en el esquema de almacenamiento y en la forma de obtener acceso a los objetos del almacén de datos y transformarlos en objetos de programación. Entity Framework usa un modelo conceptual, un modelo de almacenamiento y la asignación entre ambos modelos para transformar las operaciones de creación, lectura, actualización y eliminación de las entidades en las operaciones equivalentes en el origen de datos.

Bb399232.note(es-es,VS.100).gifNota:
Todos los fragmentos del archivo de asignación que se muestran en esta sección los genera la herramienta Entity Data Model Wizard.

Modelo conceptual

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

El fragmento XML siguiente representa parte del modelo conceptual School (basado en la base de datos de ejemplo School). En el ejemplo se muestran los tipos de entidad Department y Course que están relacionados por la asociación FK_Course_Department; las demás entidades y asociaciones se han quitado.

<Schema Namespace="SchoolModel" Alias="Self" 
xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" 
      xmlns="https://schemas.microsoft.com/ado/2008/09/edm">
  <EntityContainer Name="SchoolEntities">
   <EntitySet Name="Courses" EntityType="SchoolModel.Course" />
   <EntitySet Name="Departments" EntityType="SchoolModel.Department" />

  <AssociationSet Name="FK_Course_Department" 
                  Association="SchoolModel.FK_Course_Department">
            <End Role="Department" EntitySet="Departments" />
            <End Role="Course" EntitySet="Courses" />
  </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" />
       <Property Name="Credits" Type="Int32" Nullable="false" />
       <Property Name="DepartmentID" Type="Int32" Nullable="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" />
       <Property Name="Budget" Type="Decimal" Nullable="false" 
                 Precision="19" Scale="4" />
       <Property Name="StartDate" Type="DateTime" Nullable="false" />
       <Property Name="Administrator" Type="Int32" />
       <NavigationProperty Name="Courses" 
                       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="*" />
          <ReferentialConstraint>
            <Principal Role="Department">
              <PropertyRef Name="DepartmentID" />
            </Principal>
            <Dependent Role="Course">
              <PropertyRef Name="DepartmentID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>

      </Schema>

Modelo de almacenamiento

El modelo de almacenamiento se describe mediante el lenguaje de definición de esquemas de almacenamiento (SSDL). Los tipos de datos de las propiedades declaradas en 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 de la base de datos School que están relacionadas por la clave externa FK_Course_Department; las demás entidades y asociaciones se han quitado.

<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/2009/02/edm/ssdl">
  <EntityContainer Name="SchoolModelStoreContainer">
   <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" 
              store:Type="Tables" Schema="dbo" />
   <EntitySet Name="Department" 
              EntityType="SchoolModel.Store.Department" 
              store:Type="Tables" Schema="dbo" />

    <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" />
       <Property Name="Credits" Type="int" Nullable="false" />
       <Property Name="DepartmentID" Type="int" Nullable="false" />
  </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" />
       <Property Name="Budget" Type="money" Nullable="false" />
       <Property Name="StartDate" Type="datetime" Nullable="false" />
       <Property Name="Administrator" Type="int" />
  </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="DepartmentID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
        
</Schema>

Especificación de asignaciones

Una especificación de asignaciones usa el lenguaje de especificación de asignaciones (MSL) para asignar el modelo conceptual al 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 del modelo School.

<Mapping Space="C-S" 
          xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
  <EntityContainerMapping 
                 StorageEntityContainer="SchoolModelStoreContainer" 
                 CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Courses">
     <EntityTypeMapping TypeName="SchoolModel.Course">
      <MappingFragment StoreEntitySet="Course">
       <ScalarProperty Name="CourseID" ColumnName="CourseID" />
       <ScalarProperty Name="Title" ColumnName="Title" />
       <ScalarProperty Name="Credits" ColumnName="Credits" />
       <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
      </MappingFragment>
     </EntityTypeMapping>
    </EntitySetMapping>
    <EntitySetMapping Name="Departments">
     <EntityTypeMapping TypeName="SchoolModel.Department">
      <MappingFragment StoreEntitySet="Department">
       <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
       <ScalarProperty Name="Name" ColumnName="Name" />
       <ScalarProperty Name="Budget" ColumnName="Budget" />
       <ScalarProperty Name="StartDate" ColumnName="StartDate" />
       <ScalarProperty Name="Administrator" 
                       ColumnName="Administrator" />
      </MappingFragment>
     </EntityTypeMapping>
    </EntitySetMapping>
   </EntityContainerMapping>
</Mapping>

Análisis

El modelo School que se analiza aquí usa 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, como la asignación de tabla por jerarquía o la asignación de tabla por tipo. Para obtener más información, vea Entity Data Model Tools Scenarios y Definir modelos de datos avanzados (tareas de Entity Framework).

Vea también

Conceptos

Terminología de Entity Framework

Otros recursos

Introducción (Entity Framework)
Definir modelos de datos avanzados (tareas de Entity Framework)
Especificaciones CSDL, SSDL y MSL