Cómo: Definir un modelo con una única entidad asignada a dos tablas
En este tema se describe cómo crear manualmente un modelo conceptual en el que un tipo de entidad se asigna a dos tablas de la base de datos subyacente. Puede utilizar estos mismos conceptos para asignar un tipo de entidad a más de dos tablas.
Nota: |
---|
La manera recomendada de definir un modelo con un tipo de entidad asignada a varias tablas consiste en usar ADO.NET Entity Data Model Tools.Para obtener más información, vea Walkthrough: Mapping an Entity to Multiple Tables. |
Solamente debe asignar un tipo de entidad a varias tablas si se cumplen las siguientes condiciones:
Las tablas a las que está asignando comparten una clave común.
El tipo de entidad que está estado asignando tiene entradas en cada tabla subyacente. En otras palabras, el tipo de entidad representa datos que tienen una correspondencia uno a uno entre las dos tablas; el tipo de entidad representa una combinación interna de las dos tablas.
Los pasos básicos para definir manualmente un modelo con una entidad asignada a dos tablas son los siguientes:
Defina un tipo de entidad con propiedades que correspondan a columnas en cada una de las tablas subyacentes. Para obtener más información, vea EntityType (Elemento) (CSDL).
Defina la asignación para el tipo de entidad utilizando un elemento MappingFragment para cada tabla subyacente. Para obtener más información, vea EntityTypeMapping (Elemento) (MSL) y MappingFragment (Elemento) (MSL).
El siguiente ejemplo supone que ha instalado la base de datos de ejemplo School y que ha configurado manualmente el proyecto para que utilice Entity Framework . Para obtener más información, vea Crear la aplicación de ejemplo School (Tutorial rápido de Entity Framework) y Configurar Entity Framework (tareas de Entity Framework).
Nota: |
---|
En el siguiente ejemplo se asignará un tipo de entidad a las tablas Person y OfficeAssignement de la base de datos de ejemplo School.Observe que se cumplen las condiciones para asignar un tipo de entidad a estas tablas.Esto es, una combinación interna de las dos tablas dará como resultado todas las personas que tienen un trabajo de oficina. |
Para crear el modelo de almacenamiento
Agregue el siguiente archivo XML a su proyecto y denomínelo
School.ssdl
.<Schema Namespace="SchoolModel.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="SchoolModelStoreContainer"> <EntitySet Name="OfficeAssignment" EntityType="SchoolModel.Store.OfficeAssignment" store:Type="Tables" Schema="dbo" /> <EntitySet Name="Person" EntityType="SchoolModel.Store.Person" store:Type="Tables" Schema="dbo" /> </EntityContainer> <EntityType Name="OfficeAssignment"> <Key> <PropertyRef Name="InstructorID" /> </Key> <Property Name="InstructorID" Type="int" Nullable="false" /> <Property Name="Location" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Timestamp" Type="timestamp" Nullable="false" StoreGeneratedPattern="Computed" /> </EntityType> <EntityType Name="Person"> <Key> <PropertyRef Name="PersonID" /> </Key> <Property Name="PersonID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> <Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="HireDate" Type="datetime" /> <Property Name="EnrollmentDate" Type="datetime" /> </EntityType> </Schema>
Para crear el modelo conceptual
Agregue el siguiente archivo XML a su proyecto y denomínelo
School.csdl
. Tenga en cuenta los siguientes extremos:El tipo de entidad Instructor tiene propiedades que se asignan a todas las columnas de las tablas Person y OfficeAssignment (vea el modelo de almacenamiento anterior para obtener detalles sobre las tablas).
Nota: Dado que el tipo de entidad Instructor es un tipo heredado, hereda todas las propiedades de su tipo base, Person.Junto con las propiedades que son únicas del tipo Instructor, el tipo de entidad Instructor tiene propiedades que asignan a todas las columnas de las tablas subyacentes.
<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" annotation:LazyLoadingEnabled="true"> <EntitySet Name="People" EntityType="SchoolModel.Person" /> </EntityContainer> <EntityType Name="Person"> <Key> <PropertyRef Name="PersonID" /> </Key> <Property Type="Int32" Name="PersonID" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> <Property Type="String" Name="LastName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> <Property Type="String" Name="FirstName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> <Property Type="DateTime" Name="EnrollmentDate" /> </EntityType> <EntityType Name="Instructor" BaseType="SchoolModel.Person" > <Property Type="DateTime" Name="HireDate" Nullable="false" /> <Property Type="Binary" Name="Timestamp" Nullable="false" MaxLength="8" FixedLength="true" annotation:StoreGeneratedPattern="Computed" /> <Property Type="String" Name="Location" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> </EntityType> </Schema>
Para definir la asignación entre el modelo conceptual y el modelo de almacenamiento
Agregue el siguiente archivo XML a su proyecto y denomínelo
School.msl
. Tenga en cuenta los siguientes extremos:- Dentro del elemento EntityTypeMapping para el tipo de entidad Instructor, se utilizan elementos MappingFragment independientes para asignar propiedades a las tablas adecuadas.
<Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" CdmEntityContainer="SchoolEntities"> <EntitySetMapping Name="People"> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Instructor)"> <MappingFragment StoreEntitySet="Person"> <ScalarProperty Name="PersonID" ColumnName="PersonID" /> <ScalarProperty Name="HireDate" ColumnName="HireDate" /> <Condition ColumnName="HireDate" IsNull="false" /> </MappingFragment> <MappingFragment StoreEntitySet="OfficeAssignment"> <ScalarProperty Name="PersonID" ColumnName="InstructorID" /> <ScalarProperty Name="Timestamp" ColumnName="Timestamp" /> <ScalarProperty Name="Location" ColumnName="Location" /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Person)"> <MappingFragment StoreEntitySet="Person"> <ScalarProperty Name="PersonID" ColumnName="PersonID" /> <ScalarProperty Name="LastName" ColumnName="LastName" /> <ScalarProperty Name="FirstName" ColumnName="FirstName" /> <ScalarProperty Name="EnrollmentDate" ColumnName="EnrollmentDate" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping>
Vea también
Otros recursos
Especificaciones CSDL, SSDL y MSL
Definir modelos de datos avanzados (tareas de Entity Framework)