Cómo: Definir un modelo con múltiples conjuntos de entidades por tipo (Entity Framework)

En el tema se describe cómo crear un modelo conceptual con varios conjuntos de entidades por tipo (MEST). La definición de múltiples conjuntos de entidades por tipo permite a los usuarios simplificar su código cuando varias tablas de la base de datos subyacente tienen la misma estructura. Cuando está trabajando con tipos de entidad que no tienen asociaciones a otros tipos, definir un modelo MEST resulta sencillo. Sin embargo, para definir un modelo MEST para tipos de entidad que tienen asociaciones con otros tipos, debe implementar MEST para cada tipo del gráfico de objetos. ¿Para obtener más información, vea el blog sobre MEST: ¿qué es y cómo funciona? En este tema se describe cómo definir un modelo MEST para un tipo de entidad que no tiene las asociaciones con otros tipos.

Observe que solo debe implementar MEST cuando las tablas de base de datos subyacentes tengan la misma estructura.

Los pasos básicos para definir un modelo MEST son los siguientes:

  1. Utilice varios elementos EntitySet (cada uno con el mismo valor para el atributo EntityType) para definir varios conjuntos de entidades para un tipo determinado en el modelo conceptual.

  2. Asigne cada conjunto de entidades a la tabla adecuada en el lenguaje de especificación de asignaciones (MSL). Para obtener más información, vea EntitySetMapping (Elemento) (MSL).

El siguiente ejemplo supone que ha instalado la siguiente base de datos de ejemplo:

USE [master]
GO
CREATE DATABASE [TestDB] 
GO

SET QUOTED_IDENTIFIER OFF;
SET ANSI_NULLS ON;
GO

USE [TestDB]
GO

-- --------------------------------------------------
-- Create Tables
-- --------------------------------------------------

-- Creating table 'GraduateCourses'
CREATE TABLE [dbo].[GraduateCourses] (
    [GraduateCourseId] int  NOT NULL,
    [Title] nvarchar(max)  NOT NULL,
    [Credits] int  NOT NULL
);
GO
-- Creating table 'UnderGraduateCourses'
CREATE TABLE [dbo].[UnderGraduateCourses] (
    [UnderGraduateCourseId] int  NOT NULL,
    [Title] nvarchar(max)  NOT NULL,
    [Credits] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key in table 'GraduateCourses'
ALTER TABLE [dbo].[GraduateCourses] WITH NOCHECK 
ADD CONSTRAINT [PK_GraduateCourses]
    PRIMARY KEY CLUSTERED ([GraduateCourseId] ASC)
    ON [PRIMARY]
GO
-- Creating primary key in table 'UnderGraduateCourses'
ALTER TABLE [dbo].[UnderGraduateCourses] WITH NOCHECK 
ADD CONSTRAINT [PK_UnderGraduateCourses]
    PRIMARY KEY CLUSTERED ([UnderGraduateCourseId] ASC)
    ON [PRIMARY]
GO

El ejemplo también supone que ha configurado el proyecto para utilizar . Para obtener más información, vea Configurar Entity Framework (tareas de Entity Framework).

Para crear el modelo de almacenamiento

  1. Agregue el siguiente archivo XML a su proyecto y denomínelo MEST.ssdl.

    O bien

    Agregue un archivo .edmx vacío (MEST.edmx) al proyecto y reemplace el elemento Schema bajo el elemento edmx:StorageModels con el elemento Schema en el siguiente archivo XML. Para obtener más información, vea How to: Create a New .edmx File y .edmx File Overview.

    Observe que las tablas del modelo de almacenamiento tienen la misma estructura.

    <?xml version="1.0" encoding="utf-8" ?>
    <Schema Namespace="MEST.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="MESTStoreContainer">
        <EntitySet Name="GraduateCourses"
                   EntityType="MEST.Store.GraduateCourses"
                   store:Type="Tables" Schema="dbo" />
        <EntitySet Name="UnderGraduateCourses"
                   EntityType="MEST.Store.UnderGraduateCourses"
                   store:Type="Tables" Schema="dbo" />
      </EntityContainer>
      <EntityType Name="GraduateCourses">
        <Key>
          <PropertyRef Name="GraduateCourseId" />
        </Key>
        <Property Name="GraduateCourseId" Type="int" Nullable="false" />
        <Property Name="Title" Type="nvarchar(max)" Nullable="false" />
        <Property Name="Credits" Type="int" Nullable="false" />
      </EntityType>
      <EntityType Name="UnderGraduateCourses">
        <Key>
          <PropertyRef Name="UnderGraduateCourseId" />
        </Key>
        <Property Name="UnderGraduateCourseId" Type="int" Nullable="false" />
        <Property Name="Title" Type="nvarchar(max)" Nullable="false" />
        <Property Name="Credits" Type="int" Nullable="false" />
      </EntityType>
    </Schema>
    

Para crear el modelo conceptual

  1. Agregue el siguiente archivo XML a su proyecto y denomínelo MEST.csdl.

    O bien

    En el archivo .edmx, reemplace el elemento Schema del elemento edmx:ConceptualModels con el elemento Schema en el siguiente archivo XML.

    Observe que se han definido dos conjuntos de entidades para el tipo de entidad Course.

    <?xml version="1.0" encoding="utf-8" ?>
    <Schema xmlns="https://schemas.microsoft.com/ado/2008/09/edm"
                  xmlns:cg="https://schemas.microsoft.com/ado/2006/04/codegeneration"
                  xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
                  Namespace="MEST" Alias="Self"
                  xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation">
      <EntityContainer Name="MESTContainer" annotation:LazyLoadingEnabled="true">
        <EntitySet Name="GraduateCourses" EntityType="MEST.Course" />
        <EntitySet Name="UnderGraduateCourses" EntityType="MEST.Course" />
      </EntityContainer>
      <EntityType Name="Course">
        <Key>
          <PropertyRef Name="CourseId" />
        </Key>
        <Property Type="Int32" Name="CourseId" Nullable="false" />
        <Property Type="String" Name="Title" Nullable="false" />
        <Property Type="Int32" Name="Credits" Nullable="false" />
      </EntityType>
    </Schema>
    

Para definir la asignación entre el modelo conceptual y el modelo de almacenamiento

  1. Agregue el siguiente archivo XML a su proyecto y denomínelo MEST.msl.

    O bien

    En el archivo .edmx, reemplace el elemento Mapping del elemento edmx:Mappings con el elemento Mapping en el siguiente archivo XML.

    Observe que cada conjunto de entidades está asignado a la base de datos subyacente adecuada.

    <?xml version="1.0" encoding="utf-8" ?>
    <Mapping Space="C-S"
                 xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
      <EntityContainerMapping StorageEntityContainer="MESTStoreContainer"
                              CdmEntityContainer="MESTContainer">
        <EntitySetMapping Name="GraduateCourses">
          <EntityTypeMapping TypeName="IsTypeOf(MEST.Course)">
            <MappingFragment StoreEntitySet="GraduateCourses">
              <ScalarProperty Name="CourseId" ColumnName="GraduateCourseId" />
              <ScalarProperty Name="Title" ColumnName="Title" />
              <ScalarProperty Name="Credits" ColumnName="Credits" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
        <EntitySetMapping Name="UnderGraduateCourses">
          <EntityTypeMapping TypeName="IsTypeOf(MEST.Course)">
            <MappingFragment StoreEntitySet="UnderGraduateCourses">
              <ScalarProperty Name="CourseId" ColumnName="UnderGraduateCourseId" />
              <ScalarProperty Name="Title" ColumnName="Title" />
              <ScalarProperty Name="Credits" ColumnName="Credits" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
      </EntityContainerMapping>
    </Mapping>
    

Vea también

Otros recursos

Especificaciones CSDL, SSDL y MSL
Definir modelos de datos avanzados (tareas de Entity Framework)
ADO.NET Entity Data Model Tools