Está en la página 1de 107

Getting Started with entidad Framework 4.

0
Database primero y ASP.NET 4 formas de
Web
Por Tom Dykstra|03 de diciembre de 2010
Imprimir

La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. La aplicación de ejemplo es un sitio web
para una ficticia Contoso Universidad. Incluye funcionalidades tales como admisión estudiante, curso
creación y asignaciones de instructor.
El tutorial muestra ejemplos en C#. La muestra descargable contiene código en C# y Visual Basic.
Base de datos primero
Hay tres maneras que usted puede trabajar con datos en Entity Framework: Primera base de datos, Primer
modeloy Primer código. Este tutorial es para el primera base de datos. Para obtener más información sobre
las diferencias entre estos flujos de trabajo y orientación sobre cómo elegir el mejor uno de su escenario,
verEntidad marco desarrollo de flujos de trabajo.
Formularios Web Forms
Esta serie de tutoriales utiliza el modelo de los formularios Web ASP.NET y asume que ya sabes cómo
trabajar con formularios Web ASP.NET en Visual Studio. Si no, ves Empezando con ASP.NET 4.5
formularios Web Forms.Si usted prefiere trabajar con el framework ASP.NET MVC, vea Introducción a
Entity Framework utilizando ASP.NET MVC.
Versiones de software
Se muestra
en el tutorial También trabaja con

Windows 7 Windows 8

Visual Studio 2010 Express para Web.

Visual Studio El tutorial no ha sido probado con versiones anteriores de Visual Studio. Hay muchas
2010 diferencias en las selecciones de menú, cuadros de diálogo y plantillas.

4. NET 4.5. net es compatible con .NET 4, pero el tutorial no ha sido probado con .NET 4.5.

El tutorial no ha sido probado con las versiones posteriores de Entity Framework.

A partir de entidad marco 5, EF usa por defecto la DbContext API que fue introducido
con EF 4.1. El control EntityDataSource fue diseñado para
Entity utilizar ObjectContext API.Para obtener más información sobre cómo utilizar el control
Framework 4 EntityDataSource con laDbContext API, vea esta entrada de blog.
Preguntas
Si tienes preguntas que no están directamente relacionadas con el tutorial, se les pueden enviar al Foro de
ASP.NET Entity Framework, Entity Framework y LINQ to Foro de entidadeso StackOverflow.com.

Resumen
La aplicación que va a construir estos tutoriales es un sitio web simple Universidad.

Los usuarios pueden ver y actualizar información de instructor, curso y estudiante. Abajo se muestran
algunas de las pantallas que crearás.
Creación de la aplicación Web
Para empezar el tutorial, Abra Visual Studio y crear un nuevo proyecto de aplicación Web ASP.NET
utilizando la plantilla de aplicación Web ASP.NET :
Esta plantilla crea un proyecto de aplicación web que ya incluye una hoja de estilos y páginas maestras:
Abre el archivo Site.Master y cambiar "Mi aplicación ASP.NET" a "Universidad Contoso".
<h1>
Contoso University
</h1>
Encontrar el menú de control llamado NavigationMenu y reemplazarlo por el siguiente marcado, que
añade elementos de menú para las páginas que va a crear.
<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu"
EnableViewState="false"
IncludeStyleBlock="false" Orientation="Horizontal">
<Items>
<asp:MenuItem NavigateUrl="~/Default.aspx" Text="Home" />
<asp:MenuItem NavigateUrl="~/About.aspx" Text="About" />
<asp:MenuItem NavigateUrl="~/Students.aspx" Text="Students">
<asp:MenuItem NavigateUrl="~/StudentsAdd.aspx" Text="Add
Students" />
</asp:MenuItem>
<asp:MenuItem NavigateUrl="~/Courses.aspx" Text="Courses">
<asp:MenuItem NavigateUrl="~/CoursesAdd.aspx" Text="Add
Courses" />
</asp:MenuItem>
<asp:MenuItem NavigateUrl="~/Instructors.aspx"
Text="Instructors">
<asp:MenuItem NavigateUrl="~/InstructorsCourses.aspx"
Text="Course Assignments" />
<asp:MenuItem NavigateUrl="~/OfficeAssignments.aspx"
Text="Office Assignments" />
</asp:MenuItem>
<asp:MenuItem NavigateUrl="~/Departments.aspx"
Text="Departments">
<asp:MenuItem NavigateUrl="~/DepartmentsAdd.aspx"
Text="Add Departments" />
</asp:MenuItem>
</Items>
</asp:Menu>
Abra la página Default.aspx y cambiar el control de Content llamado BodyContent a esto:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>
Welcome to Contoso University!
</h2>
</asp:Content>
Ahora tienes una simple página web con enlaces a las diferentes páginas que podrá estar creando:

Crear la base de datos


Para estos tutoriales, utilizará el diseñador de modelo de datos de Entity Framework para crear
automáticamente el modelo de datos basado en una base de datos existente (a menudo llamado el
enfoque de primera base de datos ).Es una alternativa que no está cubierta en esta serie de tutoriales para
crear el modelo de datos manualmente y luego tener los diseñador generar scripts que crean la base de
datos (el primer modelo de enfoque).
Para el método de primera base de datos utilizado en este tutorial, el siguiente paso es agregar una base
de datos al sitio. La forma más fácil es primero descargar el proyecto que va con este tutorial. Luego haga
clic derecho en la carpeta App_Data y seleccione Agregar elemento existente, seleccione el archivo de
base de datos School.mdf en el proyecto descargado.
Una alternativa es seguir las instrucciones a la creación de la escuela muestra base de datos. Si quieres
descargar la base de datos o crean, copie el archivo School.mdf de la siguiente carpeta a la
carpeta App_Data de la aplicación:
%PROGRAMFILES%\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA
(Esta ubicación del archivo .mdf asume que estás usando SQL Server 2008 Express).
Si se crea la base de datos desde una secuencia de comandos, realice los siguientes pasos para crear un
diagrama de base de datos:

1. En el Explorador de servidores, ampliar Las conexiones de datos, expanda School.mdf, Diagramas


de base de datoscon el botón derecho y seleccione Agregar nuevo diagrama.

2. Seleccionar todas las tablas y haga clic en Agregar.

SQL Server crea un diagrama de base de datos que muestra las tablas, las columnas de las tablas y
relaciones entre las tablas. Puede mover las mesas alrededor de organizarlos sin embargo te gusta.
3. Guardar el diagrama como "SchoolDiagram" y lo cerramos.

Si descarga el archivo School.mdf que acompaña este tutorial, usted puede ver el diagrama de base de
datos haciendo doble clic en SchoolDiagram bajo Esquemas de base de datos en el Explorador de
servidores.
El diagrama se ve algo como esto (las tablas pueden ser en lugares diferentes de lo que se muestra aquí):

Crear el marco Entity Data Model


Ahora puede crear un modelo de datos de Entity Framework desde esta base de datos. Puede crear el
modelo de datos en la carpeta raíz de la aplicación, pero para este tutorial se le coloca en una carpeta
llamada DAL (para la capa de acceso a datos).
En el Explorador de soluciones, agregue una carpeta de proyecto llamada DAL (Asegúrese de que está
bajo el proyecto, no bajo la solución).
Haga clic derecho en la carpeta DAL y seleccione Nuevo elementoy Add . Instalar plantillas,
seleccione datos, seleccione la plantilla de ADO.NET Entity Data Model , el nombre SchoolModel.edmxy
haga clic en Agregar.

Esto inicia al asistente de modelo de datos de entidad. En el primer paso del asistente, se selecciona la
opción degeneración de base de datos por defecto. Haga clic en siguiente.
En el paso de Elegir la conexión de datos , deje los valores predeterminados y haga clic en siguiente. La
base de datos School está seleccionada por defecto y la configuración de conexión se guarda en el
archivo Web.config comoSchoolEntities.
En el paso del asistente Elegir su base de datos de objetos , seleccione todos los cuadros
excepto sysdiagrams(que fue creado para el diagrama que generó anteriormente) y haga clic
en Finalizar.
Después de que ha terminado creando el modelo, Visual Studio muestra una representación gráfica de los
objetos de Entity Framework (entidades) que corresponden a las tablas de base de datos. (Como con el
diagrama de base de datos, la ubicación de los elementos individuales puede ser diferente de lo que ve en
esta ilustración. Puede arrastrar los elementos alrededor para que coincida con la ilustración si quieres).
Explorando el marco Entity Data Model
Puedes ver que el diagrama entidad es muy similar al diagrama de base de datos, con un par de
diferencias. Una diferencia es la adición de símbolos al final de cada asociación que indican el tipo de
asociación (relaciones de tablas se denominan asociaciones de entidad en el modelo de datos):
 Una asociación de uno a cero-o-uno está representada por "1" y "decisionales".

En este caso, una entidad Person puede o no puede estar asociada con una
entidad OfficeAssignment . Una entidad OfficeAssignment debe estar asociada a una entidad
de Person . En otras palabras, un instructor puede o no puede ser asignado a una oficina, y cualquier
oficina puede asignarse a sólo un instructor.
 Una asociación de uno a muchos es representada por "1" y "*".
En este caso, una entidad Person puede o no puede tener asociados StudentGrade entidades. Una
entidadStudentGrade debe estar asociada a una entidad de Person . StudentGrade entidades
representan realmente cursos inscritos en esta base de datos; Si un estudiante está matriculado en un
curso y todavía no hay ningún grado, el Grade propiedad es null. En otras palabras, un estudiante no
puede ser registrado en cualquier curso todavía, puede estar matriculado en un curso o puede estar
matriculado en cursos múltiples. Cada grado en un curso de inscrito se aplica a sólo un estudiante.
 Una asociación de muchos-a-muchos está representada por "*" y "*".
En este caso, una entidad Person puede o no puede tener asociados Course entidades, y lo
contrario también es cierto: una entidad de Course pueden o no pueden tener asociados
entidades Person . En otras palabras, un instructor puede enseñar cursos múltiples, y un curso puede
ser impartido por instructores múltiples. (En esta base de datos, esta relación se aplica únicamente a
los instructores; no lo vincula estudiantes a cursos. Los estudiantes están ligados a cursos por la mesa
de StudentGrades.)
Otra diferencia entre el diagrama de base de datos y el modelo de datos es la sección de Propiedades de
navegación adicional para cada entidad. Una propiedad de navegación de una entidad hace referencia a
entidades relacionadas. Por ejemplo, la propiedad de Courses en una entidad Person contiene una
colección de todas las entidades de Course que están relacionadas con esa entidad de Person .

Sin embargo, otra diferencia entre el modelo de base de datos y datos es la ausencia de la tabla de
Asociación deCourseInstructor que se utiliza en la base de datos para vincular las
tablas Person y Course en una relación de varios a varios. Las propiedades de navegación le permiten
obtener entidades relacionadas del Course de la entidad de Person y entidades relacionadas de
la Person de la entidad de Course , así que no hay necesidad de representar la tabla de asociación en el
modelo de datos.

Para los propósitos de este tutorial, supongamos que la columna FirstName de la tabla Person contiene
en realidad tanto primer nombre y segundo nombre de una persona. Desea cambiar el nombre del campo
para reflejar esto, pero el administrador de base de datos (DBA) no quiera cambiar la base de datos. Puede
cambiar el nombre de la propiedad FirstName en el modelo de datos, dejando su base de datos
equivalente sin cambios.
En el diseñador, haga clic derecho en el apellido en la entidad de Person y luego seleccione Rename.
Escriba el nuevo nombre de "FirstMidName". Esto cambia la forma que hace referencia a la columna de
código sin cambiar la base de datos.

El navegador modelo proporciona otra forma de ver la estructura de base de datos, la estructura del
modelo de datos y la asignación entre ellos. Para verlo, haga clic derecho en un área vacía en el diseñador
de la entidad y haga clic en Explorador de modelos.

El panel Explorador de modelos muestra una vista de árbol. (El panel Explorador de modelos puede ser
acoplado con el panel Explorador de soluciones ). El nodo SchoolModel representa la estructura del
modelo de datos y el nodo SchoolModel.Store representa la estructura de base de datos.
Expanda SchoolModel.Store para ver las tablas, ampliar/tablas / vistas para ver las tablas y luego
ampliar cursopara ver las columnas de una tabla.

Expanda SchoolModel, ampliar los Tipos de entidady luego expanda el nodo del curso para ver si las
entidades y las propiedades dentro de las entidades.

En el panel Explorador de modelos o el diseñador se puede ver cómo el Entity Framework se refiere a los
objetos de los dos modelos. Haga clic derecho en la entidad de Person y seleccione Asignación de mesa.
Esto abre la ventana Detalles de mapeo . Tenga en cuenta que esta ventana permite ver que la columna
de base de datos FirstName se asigna a FirstMidName, que es lo cambió el nombre a que en el modelo
de datos.

Entity Framework utiliza XML para almacenar información sobre la base de datos, el modelo de datos y las
asignaciones entre ellos. El archivo SchoolModel.edmx es en realidad un archivo XML que contiene esta
información.El diseñador procesa la información en un formato gráfico, pero también puede ver el archivo
como XML haciendo clic en el archivo .edmx en el Explorador de soluciones, haga clic en Abrir cony
seleccionar Editor XML (texto). (El diseñador del modelo de datos y un editor de XML son sólo dos
formas diferentes de abrir y trabajar con el mismo archivo, así que no puedes tener el diseñador abrir y
abrir el archivo en un editor de XML al mismo tiempo).
Ahora han creado un sitio web, una base de datos y un modelo de datos. En el siguiente tutorial usted
comenzará a trabajar con datos utilizando el modelo de datos y el control ASP.NET EntityDataSource .
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 2
Por Tom Dykstra|03 de diciembre de 2010
Imprimir

La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie

El Control EntityDataSource
En el tutorial anterior creó un sitio web, una base de datos y un modelo de datos. En este tutorial se
trabaja con el control EntityDataSource que ASP.NET proporciona para hacerla fácil trabajar con un
modelo de datos de Entity Framework. Crearás un control GridView para mostrar y editar datos de los
estudiantes, un control DetailsViewpara agregar nuevos estudiantes y un control DropDownList para
seleccionar un departamento (que utilizará más tarde para la visualización de cursos asociados).

Tenga en cuenta que en esta aplicación no se agregar validación de entrada a páginas que actualización la
base de datos, y algunos de la gestión de errores no será tan robustos como serían necesarios en una
aplicación de producción. Eso mantiene el tutorial se centró en Entity Framework y mantiene poniendo
demasiado tiempo. Para obtener más información acerca de cómo agregar estas características a su
aplicación, consulte Validating User Input en páginas Web ASP.NET y Manejo de errores en las páginas
ASP.NET y aplicaciones.
Agregar y configurar el Control EntityDataSource
Empezarás por configurar un control EntityDataSource para leer las entidades Person desde el
conjunto de entidades de People .
Asegúrese de que tiene Visual Studio abiertos y que estás trabajando con el proyecto que ha creado en
parte 1. Si no has construido el proyecto desde que creó el modelo de datos o desde el último cambio
que lo hiciste, genere el proyecto ahora. Los cambios en el modelo de datos no estarán disponibles para el
diseñador hasta que el proyecto se construye.
Crear una nueva página web utilizando la plantilla de formulario de la Web utilizando la página
maestra y asígnele el nombre Students.aspx.

Especificar Site.Master como página maestra. Todas las páginas creadas para estos tutoriales utilizará esta
página maestra.
En la vista código fuente , añadir un encabezado h2 para el control de Content llamado Content2, como
se muestra en el ejemplo siguiente:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Student List</h2>
</asp:Content>
Desde la ficha de datos de la caja de herramientas, arrastre un control EntityDataSource a la página,
déjalo debajo del encabezado y cambiar el ID de StudentsEntityDataSource:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Student List</h2>
<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server">
</asp:EntityDataSource>
</asp:Content>
Cambie a la vista diseño , haga clic en la etiqueta inteligente del control origen de datos y haga clic
en Configurar origen de datos para iniciar al asistente Configurar origen de datos .

En el paso del asistente Configure ObjectContext , seleccione SchoolEntities como valor para
la Conexión de llamaday seleccione SchoolEntities como el valor DefaultContainerName . Haga clic
en siguiente.
Nota: Si tienes el siguiente cuadro de diálogo en este punto, tienes que construir el proyecto antes de
proceder.

En la etapa de Selección de datos configurar , seleccione personas como el valor


para EntitySetName. Enseleccionar, asegúrese de que está seleccionada la casilla de
verificación seleccionarll. Seleccione las opciones que permiten actualizar y eliminar. Cuando haya
terminado, haga clic en Finalizar.

Configuración de las reglas de base de datos para


permitir la eliminación
Usted podrá crear una página que permite a los usuarios borrar los estudiantes de la tabla de la Person ,
que tiene tres relaciones con otras tablas (Course, StudentGradey OfficeAssignment). De forma
predeterminada, la base de datos le impedirá eliminar una fila en Person si hay registros relacionados en
una de las otras tablas. Puede eliminar manualmente las filas relacionadas primero, o se puede configurar
la base de datos para eliminarlos automáticamente cuando se elimina una fila de Person . Para los
expedientes del estudiante en este tutorial, usted podrá configurar la base de datos para eliminar
automáticamente los datos relacionados. Porque los estudiantes pueden han relacionado las filas en la
tabla StudentGrade , tienes que configurar sólo una de las tres relaciones.
Si estás usando el archivo School.mdf descargado del proyecto que acompaña este tutorial, puede omitir
esta sección porque ya han hecho estos cambios en la configuración. Si ha creado la base de datos
ejecutando un script, configurar la base de datos mediante la realización de los siguientes procedimientos.
En el Explorador de servidores, abrir el diagrama de base de datos que creó en la parte 1. La relación
entre laPerson y StudentGrade (la línea entre tablas) con el botón derecho y seleccione Propiedades.

En la ventana Propiedades , expanda INSERT y UPDATE especificación y establezca la


propiedad DeleteRule encascada.

Guarde y cierre el diagrama. Si te preguntan si desea actualizar la base de datos, haga clic en Sí.
Para asegurarse de que el modelo mantiene las entidades que están en la memoria en sintonía con lo que
está haciendo la base de datos, debe establecer las reglas correspondientes en el modelo de
datos. AbrirSchoolModel.edmx, haga clic derecho en la línea de asociación entre
la Person y StudentGradey a continuación, seleccione Propiedades.

En la ventana Propiedades , establezca End1 OnDelete Cascade.


Guarde y cierre el archivo SchoolModel.edmx y luego reconstruir el proyecto.
En general, cuando cambia la base de datos, usted tiene varias opciones de cómo sincronizar el modelo:

 Para ciertos tipos de cambios (por ejemplo, agregar o actualizar las tablas, vistas o procedimientos
almacenados), haga clic en el diseñador y seleccione Un modelo de actualización de base de
datos que tiene el diseñador hace los cambios automáticamente.
 Regenerar el modelo de datos.
 Realizar actualizaciones manuales como éste.
En este caso, usted podría haberse regenerado el modelo o actualiza las tablas afectadas por el cambio de
relación, pero entonces tendrías que hacer el cambio de nombre de campo
(de FirstName a FirstMidName).

Usando un Control GridView para leer y actualizar las


entidades
En esta sección deberá usar un control GridView para mostrar, actualizar o eliminar los estudiantes.
Abra o cambie a Students.aspx y cambie a la vista de diseño . Desde la ficha de datos de la caja de
herramientas, arrastre un control GridView a la derecha del
control EntityDataSource , StudentsGridViewel nombre, haga clic en la etiqueta inteligente y luego
seleccione StudentsEntityDataSource como origen de datos.
Haga clic en Actualizar esquema (haga clic en Sí si se le pedirá que confirme), luego haga clic
en Habilitar la paginación, Permiten clasificar, Habilitar edicióny Permiten eliminar.
Haga clic en Editar columnas.

En el cuadro campos seleccionados , eliminar PersonID, LastNamey HireDate. Normalmente no muestra


una clave de registro para los usuarios, fecha de contratación no es relevante para los estudiantes y a
poner ambas partes del nombre en un campo, tan sólo necesita uno de los campos de nombre).
Seleccione el campo FirstMidName y haga clic en convertir este campo en un TemplateField.
Hacer lo mismo para EnrollmentDate.

Haga clic en Aceptar y luego cambiar a la vista de código fuente . Los cambios restantes serán más
fáciles de hacer directamente en el marcado. El marcado de control GridView parece ahora en el siguiente
ejemplo.
<asp:GridView ID="StudentsGridView" runat="server" AllowPaging="True"
AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="PersonID"
DataSourceID="StudentsEntityDataSource">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:TemplateField HeaderText="FirstMidName"
SortExpression="FirstMidName">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%#
Bind("FirstMidName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%#
Bind("FirstMidName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="EnrollmentDate"
SortExpression="EnrollmentDate">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%#
Bind("EnrollmentDate") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%#
Bind("EnrollmentDate") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
La primera columna después de que el campo de comando es una plantilla que actualmente muestra el
nombre del primero. Cambiar el marcado para este campo plantilla como en el siguiente ejemplo:
<asp:TemplateField HeaderText="Name" SortExpression="LastName">
<EditItemTemplate>
<asp:TextBox ID="LastNameTextBox" runat="server" Text='<%#
Bind("LastName") %>'></asp:TextBox>
<asp:TextBox ID="FirstNameTextBox" runat="server" Text='<%#
Bind("FirstMidName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="LastNameLabel" runat="server" Text='<%#
Eval("LastName") %>'></asp:Label>,
<asp:Label ID="FirstNameLabel" runat="server" Text='<%#
Eval("FirstMidName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
En modo de visualización, dos controles de Label muestran el nombre y apellido. En modo de edición,
dos cuadros de texto se suministran para que puede cambiar el nombre y apellido. Como con los
controles Label en modo de visualización, utilice expresiones se Bind y Eval exactamente como lo haría
con controles de origen de datos ASP.NET que se conectan directamente a las bases de datos. La única
diferencia es que usted especifica las propiedades de la entidad en lugar de columnas de base de datos.
La última columna es un campo de plantilla que muestra la fecha de inscripción. Cambiar el marcado para
este campo como en el siguiente ejemplo:
<asp:TemplateField HeaderText="Enrollment Date"
SortExpression="EnrollmentDate">
<EditItemTemplate>
<asp:TextBox ID="EnrollmentDateTextBox" runat="server" Text='<%#
Bind("EnrollmentDate", "{0:d}") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="EnrollmentDateLabel" runat="server" Text='<%#
Eval("EnrollmentDate", "{0:d}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Tanto en Mostrar y editar el modo, la cadena de formato "{0, d}" provoca la fecha que se mostrará en el
formato "fecha corta". (El equipo puede configurarse para mostrar este formato diferente de las imágenes
en pantalla que se muestra en este tutorial).
Observe que en cada uno de estos campos de la plantilla, el diseñador utiliza una expresión Bind de
forma predeterminada, pero eso cambió a una expresión Eval en los elementos de la ItemTemplate . La
expresión Bindpone los datos disponibles en las propiedades del control GridView en caso de que usted
necesita acceder a los datos en el código. En esta página no necesitas acceder a estos datos en el código,
así que puede usar Eval, que es más eficiente. Para obtener más información, ver los datos de los
controles de datos.

Revisión de Control EntityDataSource marcado para


mejorar el rendimiento
En el marcado para el control EntityDataSource , quitar los
atributos ConnectionString yDefaultContainerName y reemplazarlos con
un ContextTypeName="ContosoUniversity.DAL.SchoolEntities"atributo. Este es un cambio que
debe hacer cada vez que se crea un control EntityDataSource , a menos que necesitas para usar una
conexión que es diferente a la que está codificado en la clase de objeto de contexto.Utilizando el
atributo ContextTypeName proporciona los siguientes beneficios:
 Mejor rendimiento. Cuando el control EntityDataSource Inicializa el modelo de datos mediante los
atributosConnectionString y DefaultContainerName , realiza trabajo adicional para cargar
metadatos a cada petición. Esto no es necesario si se especifica el atributo ContextTypeName .
 Carga perezoso está activada de forma predeterminada en las clases del contexto del objeto
generado (por ejemplo, SchoolEntities en este tutorial) en entidad Framework 4.0. Esto significa
que las propiedades de navegación están cargadas con datos relacionados automáticamente cuando
lo necesite. Carga perezoso se explica con más detalle más adelante en este tutorial.
 Cualquier personalización que aplicados a la clase de contexto de objeto (en este caso, la
claseSchoolEntities ) estará disponible para los controles que utilizan el
control EntityDataSource .Personalización de la clase de contexto de objetos es un tema avanzado
que no está cubierto en esta serie de tutoriales. Para más información, vea Extender marco generado
tipos de entidad.
El marcado ahora parecerá en el siguiente ejemplo (el orden de las propiedades puede ser diferente):

<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server"


ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People"
EnableDelete="True" EnableUpdate="True">
</asp:EntityDataSource>
El atributo EnableFlattening se refiere a una característica que era necesario en las versiones anteriores
de Entity Framework porque columnas de clave extranjeras no se exponen como propiedades de
entidad. La versión actual hace posible utilizar asociaciones claves extranjeras, que significa extranjeras
propiedades clave están expuestas para todos pero muchos-a-muchos asociaciones. Si las entidades
tienen propiedades clave extranjeras y no tipos complejos, puede dejar este atributo que se establece
en False. No quite el atributo de la marca, porque el valor predeterminado es True. Para obtener más
información, vea Objetos aplanar (EntityDataSource).
Ejecutar que la página y ver una lista de estudiantes y empleados (usted podrá filtrar para estudiantes sólo
en el siguiente tutorial). El primer nombre y apellido aparecen juntos.

Para ordenar la pantalla, haga clic en un nombre de columna.

Haga clic en Editar en cualquier fila. Cuadros de texto se muestran donde puedes cambiar el nombre y
apellido.

También funciona el botón eliminar . Haga clic en borrar para una fila que tiene una fecha de inscripción y
la fila desaparece. (Filas sin fecha inscripción representan instructores y obtendrá un error de integridad
referencial. En el siguiente tutorial se podrá filtrar esta lista para incluir sólo los estudiantes.)

Visualización de los datos de una propiedad de


navegación
Ahora suponga que usted quiere saber cuántos cursos cada estudiante está matriculado en. Entity
Framework proporciona esa información en la propiedad de navegación StudentGrades de la
entidad Person . Porque el diseño de base de datos no permite al estudiante estar matriculado en un
curso sin tener un grado asignado, para este tutorial puede suponer que teniendo una fila en la fila de la
tabla StudentGrade que está asociada con un curso es igual a ser matriculados en el curso. (La propiedad
de navegación Courses es sólo para instructores).
Cuando se utiliza el atributo ContextTypeName del control EntityDataSource , Entity Framework
recupera automáticamente información para una propiedad de navegación cuando accedes a esa
propiedad. Esto se denomina carga perezosa. Sin embargo, esto puede ser ineficaz, porque resulta en una
separada llamada a la base de datos que se necesita información adicional en cada tiempo. Si usted
necesita los datos de la propiedad de navegación para cada entidad devuelta por el
control EntityDataSource , es más eficiente para recuperar los datos relacionados con la propia entidad
en una sola llamada a la base de datos. Esto se denomina carga ansioso, y especifica estableciendo la
propiedad Include del control EntityDataSource carga dispuesto para una propiedad de navegación.
En Students.aspx, desea mostrar el número de cursos para todos los estudiantes, así carga ansiosa es la
mejor opción.Si estaban mostrando todos los estudiantes, pero mostrando el número de cursos sólo para
unos pocos de ellos (lo que requeriría escribir algún código además el marcado), perezoso carga podría
ser una opción mejor.
Abra o cambie a Students.aspx, cambie a la vista diseño , seleccione StudentsEntityDataSourcey en la
ventanaPropiedades , establezca la propiedad de incluir a StudentGrades. (Si quieres obtener múltiples
propiedades de navegación, puede especificar sus nombres separados por comas, por
ejemplo, StudentGrades, cursos.)

Cambie a la vista de la fuente . En el StudentsGridView de control, después del último


elementoasp:TemplateField , agregue el campo plantilla nueva:
<asp:TemplateField HeaderText="Number of Courses">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%#
Eval("StudentGrades.Count") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
En la expresión de Eval , puede hacer referencia a la propiedad de navegación StudentGrades. Debido a
esta propiedad contiene una colección, tiene una propiedad Count que puede utilizar para mostrar el
número de cursos en los que el estudiante está matriculado. En un posterior tutorial verás cómo mostrar
los datos de las propiedades de navegación que contienen entidades individuales en lugar de
colecciones. (Tenga en cuenta que no puede utilizar elementos BoundField para mostrar los datos de las
propiedades de navegación).
Ejecute la página y ahora ver cuántos cursos cada estudiante está matriculado en.

Usando un Control DetailsView para introducir entidades


El siguiente paso es crear una página que tenga un control DetailsView que le permitirá agregar nuevos
estudiantes. Cierre el navegador y luego crear una nueva página web usando la Página
principal Site.Master .Nombre de la página StudentsAdd.aspxy luego cambiar a la vista de código fuente .
Agregue el siguiente marcado para reemplazar el existente marcado para el control
de Content llamado Content2:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Add New Students</h2>
<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EnableInsert="True" EntitySetName="People">
</asp:EntityDataSource>
<asp:DetailsView ID="StudentsDetailsView" runat="server"
DataSourceID="StudentsEntityDataSource" AutoGenerateRows="False"
DefaultMode="Insert">
<Fields>
<asp:BoundField DataField="FirstMidName" HeaderText="First Name"
SortExpression="FirstMidName" />
<asp:BoundField DataField="LastName" HeaderText="Last Name"
SortExpression="LastName" />
<asp:BoundField DataField="EnrollmentDate" HeaderText="Enrollment Date"
SortExpression="EnrollmentDate" />
<asp:CommandField ShowInsertButton="True" />
</Fields>
</asp:DetailsView>
</asp:Content>
Este marcado crea un control EntityDataSource es similar a la que ha creado en Students.aspx, excepto
que permite la inserción. Como con el control GridView , los campos enlazados del
control DetailsView se identifican exactamente como lo sería para un control de datos que se conecta
directamente a una base de datos, excepto que hacen referencia a las propiedades de la entidad. En este
caso, el control DetailsView se utiliza solamente para la inserción de filas, así ha definido el modo por
defecto para Insert.
Ejecute la página y añadir un nuevo estudiante.
No pasará nada después de insertar un nuevo alumno, pero si ahora ejecutar Students.aspx, verás la nueva
información del estudiante.

Mostrar datos en una lista desplegable


En los siguientes pasos tendrás un control DropDownList a una entidad creada utilizando un
controlEntityDataSource databind. En esta parte del tutorial, no harás mucho con esta lista. En partes
posteriores, sin embargo, deberá usar la lista para permitir a los usuarios seleccionar un departamento
para visualizar cursos relacionados con el departamento.
Crear una nueva página web llamada Courses.aspx. En la vista código fuente , añadir un título para el
control deContent que ha nombrado Content2:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Courses by Department</h2>
</asp:Content>
En la vista diseño , agregue un control EntityDataSource a la página como lo hiciste antes, excepto que
esta vez el nombre DepartmentsEntityDataSource. Seleccione departamentos como el valor
de EntitySetName y seleccione sólo las propiedades DepartmentID y nombre .

Desde la ficha estándar de la caja de herramientas, arrastre un control DropDownList a la página, el


nombreDepartmentsDropDownList, haga clic en la etiqueta inteligente y seleccione Elegir origen de
datos para iniciar elAsistente de configuración de origen de datos.
En el paso de elegir un origen de datos , seleccione DepartmentsEntityDataSource como origen de
datos, haga clic en Actualizar esquemay luego seleccione el nombre como el campo de datos para
mostrar y DepartmentIDcomo el campo de datos de valor. Haga clic en Aceptar.

El método utilizas a databind del control mediante Entity Framework es el mismo con otros datos ASP.NET
especifica los controles de origen salvo que las entidades y las propiedades de la entidad.

Cambiar a la vista de código fuente y agregue "seleccione un departamento:" inmediatamente antes del
controlDropDownList .
Select a department:
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="EntityDataSource1" DataTextField="Name"
DataValueField="DepartmentID">
</asp:DropDownList>
Como recordatorio, cambiar el marcado para el control EntityDataSource en este momento
sustituyendo elConnectionString y DefaultContainerName atribuye con
unContextTypeName="ContosoUniversity.DAL.SchoolEntities" atributo. A menudo es mejor
esperar hasta después de que has creado el control enlazado a datos que está relacionado con el control
de origen de datos antes de cambiar el marcado control EntityDataSource , porque después de hacer el
cambio, el diseñador no le proporcionará una opción Actualizar esquema en el control enlazado a datos.
Ejecute la página y se puede seleccionar un departamento de la lista desplegable.

Esto completa la introducción al uso del control EntityDataSource . Trabajar con este control
generalmente no es diferente de trabajar con otros datos ASP.NET los controles de origen, excepto que
hace referencia a entidades y propiedades en lugar de tablas y columnas. La única excepción es cuando
quieres acceder a las propiedades de navegación. En el siguiente tutorial que verás que la sintaxis utilice
con control EntityDataSource también puede diferir de otros controles de origen de datos cuando se
filtren, grupo y datos de pedidos.
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 3
Por Tom Dykstra|03 de diciembre de 2010
Imprimir

La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie

Filtrar, ordenar y agrupar datos


En el tutorial anterior se utiliza el control EntityDataSource para mostrar y editar datos. En este tutorial
usted podrá filtrar, ordenar y agrupar datos. Cuando haces esto estableciendo las propiedades del
controlEntityDataSource , la sintaxis es diferente de otros controles de origen de datos. Como veremos,
sin embargo, puede utilizar el control QueryExtender para minimizar estas diferencias.
Usted podrá cambiar la página de Students.aspx para filtrar para los estudiantes, ordenar por nombre y en
nombre de la búsqueda. También podrá cambiar la página de Courses.aspx para visualizar cursos para el
Departamento de selección y búsqueda de cursos por nombre. Por último, añadiremos estadísticas de
estudiante a la páginaAbout.aspx .
Mediante la EntityDataSource "Donde" propiedad para
filtrar datos
Abra la página Students.aspx que creó en el tutorial anterior. Como actualmente configurado, el
control GridView en la página muestra todos los nombres del conjunto de entidades de People . Sin
embargo, desea mostrar sólo los estudiantes, que usted puede encontrar mediante la selección de
entidades de Person que tienen fechas de inscripción no es null.
Cambie a la vista diseño y seleccione el control EntityDataSource . En la ventana Propiedades ,
establezca la propiedad Where a it.EnrollmentDate is not null.
La sintaxis que se utiliza en la propiedad Where el control EntityDataSource es Entity SQL. Entity SQL es
similar a la de Transact-SQL, pero es modificado para requisitos particulares para su uso con entidades en
lugar de objetos de base de datos. En la expresión it.EnrollmentDate is not null, la
palabra it representa una referencia a la entidad que devuelve la consulta. Por lo
tanto, it.EnrollmentDate se refiere a la propiedad EnrollmentDate de la entidad de Person que
devuelve el control EntityDataSource .
Ejecutar la página. La lista de estudiantes ahora contiene sólo los estudiantes. (No quedan filas aparece
donde no hay inscripción fecha.)

Mediante la propiedad "OrderBy" EntityDataSource a los


datos de pedidos
También quiere que sea en nombre de orden cuando primero se muestra esta lista. Con la
página Students.aspxsigue abierta en la vista diseño y con el EntityDataSource control aún seleccionada,
en el ventana Propiedadesdel conjunto la propiedad OrderBy en it.LastName.
Ejecutar la página. La lista de los estudiantes está en orden por apellido.

Utilizando un parámetro de Control para establecer la


propiedad "Donde"
Como con otros controles de origen de datos, puede pasar a la propiedad Where los valores de
parámetro. En la página Courses.aspx que ha creado en la segunda parte del tutorial, puede utilizar este
método para mostrar cursos que están asociadas con el departamento que el usuario selecciona de la lista
desplegable.
Abra Courses.aspx y cambie a la vista diseño . Agregar un segundo control EntityDataSource a la página
y asígnele el nombre CoursesEntityDataSource. Conéctelo al modelo SchoolEntities y
seleccione Courses como el valor de EntitySetName .
En la ventana Propiedades , haga clic en los puntos suspensivos en donde el cuadro de la
propiedad. (Asegúrese de que el control CoursesEntityDataSource aún está seleccionado antes de usar
la ventana de Propiedades ).
Aparece el cuadro de diálogo Editor de expresiones . En este cuadro de diálogo, seleccione generar
automáticamente el donde expresión basada en los parámetros proporcionadosy haga clic en Añadir
parámetro. Nombre del parámetro DepartmentID, seleccione Control como el valor del parámetro
origen y seleccione DepartmentsDropDownList como el valor ControlID .
Haga clic en Mostrar propiedades avanzadasy en la ventana de Propiedades del cuadro de
diálogo Editor de expresiones , cambie la propiedad Type a Int32.

Cuando haya terminado, haga clic en Aceptar.


Debajo de la lista desplegable, agregue un control GridView a la página y asígnele el
nombre CoursesGridView.Conéctelo al control del origen de datos CoursesEntityDataSource , haga
clic en Actualizar esquema, haga clic en Editar columnasy quitar la columna DepartmentID . El marcado
de control GridView asemeja en el siguiente ejemplo.
<asp:GridView ID="CoursesGridView" runat="server" AutoGenerateColumns="False"
DataKeyNames="CourseID" DataSourceID="CoursesEntityDataSource">
<Columns>
<asp:BoundField DataField="CourseID" HeaderText="ID" ReadOnly="True"
SortExpression="CourseID" />
<asp:BoundField DataField="Title" HeaderText="Title"
SortExpression="Title" />
<asp:BoundField DataField="Credits" HeaderText="Credits"
SortExpression="Credits" />
</Columns>
</asp:GridView>
Cuando el usuario cambia el departamento seleccionado en la lista desplegable, quieres la lista de cursos
asociados para cambiar automáticamente. Para ello, seleccione la lista desplegable y en la
ventana Propiedades , establezca la propiedad AutoPostBack en True.

Ahora que ha terminado con el diseñador, cambie a la vista de la fuente y cambiar las propiedades de
nombreConnectionString y DefaultContainer del control CoursesEntityDataSource con
elContextTypeName="ContosoUniversity.DAL.SchoolEntities" atributo. Cuando termines, el
marcado del control se verá como en el siguiente ejemplo.
<asp:EntityDataSource ID="CoursesEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="false"
EntitySetName="Courses"
AutoGenerateWhereClause="true" Where="">
<WhereParameters>
<asp:ControlParameter ControlID="DepartmentsDropDownList" Type="Int32"
Name="DepartmentID" PropertyName="SelectedValue" />
</WhereParameters>
</asp:EntityDataSource>
Ejecute la página y utilice la lista desplegable para seleccionar diferentes departamentos. Solamente los
cursos que son ofrecidos por el Departamento de seleccionados se muestran en el control GridView .
Mediante la propiedad "GroupBy" EntityDataSource a
grupo datos
Suponga Contoso Universidad quiere poner algunas estadísticas estudiantil en su página
sobre. Específicamente, quiere mostrar un desglose de los números de estudiantes antes de la fecha que
se matriculado.
Abra About.aspxy en la vista código fuente , reemplace el contenido existente del
control BodyContent con "Estudiante cuerpo estadísticas" entre etiquetas h2 :
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>Student Body Statistics</h2>
</asp:Content>
Después de la partida, agregue un control EntityDataSource y asígnele el
nombreStudentStatisticsEntityDataSource. Conectarlo a SchoolEntities, seleccione el conjunto
de entidades dePeople y deja el cuadro Seleccione el asistente sin cambios. Establezca las siguientes
propiedades en la ventanaPropiedades :
 Para filtrar por estudiantes, establezca la propiedad Where it.EnrollmentDate is not null.
 Para agrupar los resultados de la fecha de inscripción, establezca la
propiedad GroupBy it.EnrollmentDate.
 Para seleccionar la fecha de inscripción y el número de estudiantes, establezca la
propiedad Select ait.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents.
 Para ordenar los resultados de la fecha de inscripción, establezca la
propiedad OrderBy enit.EnrollmentDate.
En la vista código fuente , cambie las propiedades de
nombre ConnectionString y DefaultContainer con una propiedad ContextTypeName . El marcado de
control EntityDataSource ahora se asemeja del siguiente ejemplo.
<asp:EntityDataSource ID="StudentStatisticsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People"
Select="it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents"
OrderBy="it.EnrollmentDate" GroupBy="it.EnrollmentDate"
Where="it.EnrollmentDate is not null" >
</asp:EntityDataSource>
La sintaxis de las propiedades Select GroupByy Where se asemeja a Transact-SQL con excepción de la
clave it que especifica la entidad actual.
Agregue el siguiente marcado para crear un control GridView para mostrar los datos.
<asp:GridView ID="StudentStatisticsGridView" runat="server"
AutoGenerateColumns="False"
DataSourceID="StudentStatisticsEntityDataSource">
<Columns>
<asp:BoundField DataField="EnrollmentDate" DataFormatString="{0:d}"
HeaderText="Date of Enrollment"
ReadOnly="True" SortExpression="EnrollmentDate" />
<asp:BoundField DataField="NumberOfStudents" HeaderText="Students"
ReadOnly="True" SortExpression="NumberOfStudents" />
</Columns>
</asp:GridView>
Ejecute la página para ver una lista mostrando el número de alumnos por fecha de inscripción.

Utilizando el Control QueryExtender para filtrar y ordenar


El control QueryExtender proporciona una manera de especificar filtrado y clasificación en el marcado. La
sintaxis es independiente del sistema de gestión de bases de datos (DBMS) estás usando. También es
generalmente independiente de Entity Framework, con la excepción de que utilizas para las propiedades
de navegación sintaxis es exclusiva de Entity Framework.
En esta parte del tutorial que utilizará un control QueryExtender para filtrar y datos de pedidos y uno de
los campos de orden será una propiedad de navegación.
(Si usted prefiere utilizar código en lugar de marcado para extender las consultas que se generan
automáticamente por el control EntityDataSource , puedes hacerlo controlando el
evento QueryCreated . Esto es cómo el controlQueryExtender extiende las consultas de
control EntityDataSource también).
Abra la página Courses.aspx y por debajo de la marca que añadiste anteriormente, introduzca el siguiente
marcado para crear un encabezado, un cuadro de texto para entrar en las cadenas de búsqueda, un botón
de búsqueda y un control EntityDataSource que está enlazado con el conjunto de entidades
de Courses .
<h2>Courses by Name</h2>
Enter a course name
<asp:TextBox ID="SearchTextBox" runat="server"></asp:TextBox>
<asp:Button ID="SearchButton" runat="server" Text="Search" />
<br /><br />
<asp:EntityDataSource ID="SearchEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="Courses"
Include="Department" >
</asp:EntityDataSource>
Aviso que es propiedad del control EntityDataSource Include al Department. En la base de datos, la
tablaCourse no contiene el nombre de Departamento; contiene una columna de clave
foránea DepartmentID . Si se consulta la base de datos directamente, para obtener el nombre de
departamento junto con datos del curso, tendrías para unirse a las mesas
de Course y Department . Estableciendo la propiedad Include al Department, se especifica que el Entity
Framework debe hacer el trabajo de conseguir la entidad Department relacionada cuando se pone una
entidad de Course . La entidad Department se almacena en la propiedad de navegación
del Departmentde la entidad de Course . (De forma predeterminada, la clase de SchoolEntities que fue
generada por el diseñador del modelo de datos recupera datos relacionados cuando sea necesario, y que
ha obligado el control de origen de datos para esa clase, así que no es necesario establecer la
propiedad Include . Sin embargo, estableciéndolo mejora el rendimiento de la página, porque de lo
contrario haría Entity Framework independientes llamadas a la base de datos para recuperar los datos para
las entidades de Course y de las entidades relacionadas del Department .)
Después del control EntityDataSource que acaba de crear, inserte el siguiente marcado para crear un
controlQueryExtender que está enlazado al control EntityDataSource .
<asp:QueryExtender ID="SearchQueryExtender" runat="server"
TargetControlID="SearchEntityDataSource" >
<asp:SearchExpression SearchType="StartsWith" DataFields="Title">
<asp:ControlParameter ControlID="SearchTextBox" />
</asp:SearchExpression>
<asp:OrderByExpression DataField="Department.Name" Direction="Ascending">
<asp:ThenBy DataField="Title" Direction="Ascending" />
</asp:OrderByExpression>
</asp:QueryExtender>
El elemento SearchExpression especifica que desea seleccionar cursos cuyos títulos coincida con el valor
especificado en el cuadro de texto. Solamente como muchos personajes que figuran en el cuadro de texto
se compararán, porque el SearchType propiedad especifica StartsWith.
El elemento OrderByExpression especifica que el conjunto de resultados se ordenarán por título del
curso en nombre del departamento. Observe cómo se especifica el nombre del
Departamento: Department.Name. Porque la asociación entre la entidad de Course y la
entidad Department es uno-a-uno, el Department propiedad de navegación contiene una entidad
del Department . (Si esto fuera una relación uno a muchos, la propiedad contendría una colección). Para
obtener el nombre del Departamento, debe especificar la propiedad Name de la entidad del Department .
Por último, agregue un control GridView para mostrar la lista de cursos:
<asp:GridView ID="SearchGridView" runat="server" AutoGenerateColumns="False"
DataKeyNames="CourseID" DataSourceID="SearchEntityDataSource"
AllowPaging="true">
<Columns>
<asp:TemplateField HeaderText="Department">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%#
Eval("Department.Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="CourseID" HeaderText="ID"/>
<asp:BoundField DataField="Title" HeaderText="Title" />
<asp:BoundField DataField="Credits" HeaderText="Credits" />
</Columns>
</asp:GridView>
La primera columna es un campo de plantilla que muestra el nombre del departamento. La expresión de
enlace de datos especifica Department.Name, al igual que viste en el control QueryExtender .
Ejecutar la página. La pantalla inicial muestra una lista de todos los cursos en orden por departamento y
luego por el título del curso.

Entrar en una "m" y haga clic en Buscar para ver todos los cursos cuyos títulos comienzan con "m" (la
búsqueda no es caso sensible).
Usando el operador "Like" para filtrar datos
Puede lograr un efecto similar a la del control QueryExtender StartsWith, Containsy tipos de
búsquedaEndsWith mediante un operador Like en propiedad del control EntityDataSource Where . En
esta parte del tutorial, verás cómo utilizar el operador Like para la búsqueda de un estudiante por
nombre.
Abra Students.aspx en vista de código fuente . Después del control GridView , agregue el marcado
siguiente:
<h2>Find Students by Name</h2>
Enter any part of the name
<asp:TextBox ID="SearchTextBox" runat="server" AutoPostBack="true"></asp:TextBox>
<asp:Button ID="SearchButton" runat="server" Text="Search" />
<br />
<br />
<asp:EntityDataSource ID="SearchEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People"
Where="it.EnrollmentDate is not null and (it.FirstMidName Like '%' +
@StudentName + '%' or it.LastName Like '%' + @StudentName + '%')" >
<WhereParameters>
<asp:ControlParameter ControlID="SearchTextBox" Name="StudentName"
PropertyName="Text"
Type="String" DefaultValue="%"/>
</WhereParameters>
</asp:EntityDataSource>
<asp:GridView ID="SearchGridView" runat="server" AutoGenerateColumns="False"
DataKeyNames="PersonID"
DataSourceID="SearchEntityDataSource" AllowPaging="true">
<Columns>
<asp:TemplateField HeaderText="Name" SortExpression="LastName,
FirstMidName">
<ItemTemplate>
<asp:Label ID="LastNameFoundLabel" runat="server" Text='<%#
Eval("LastName") %>'></asp:Label>,
<asp:Label ID="FirstNameFoundLabel" runat="server" Text='<%#
Eval("FirstMidName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Enrollment Date"
SortExpression="EnrollmentDate">
<ItemTemplate>
<asp:Label ID="EnrollmentDateFoundLabel" runat="server" Text='<%#
Eval("EnrollmentDate", "{0:d}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Este marcado es similar a lo que has visto anteriormente excepto Where el valor de la propiedad. La
segunda parte de la expresión Where define una búsqueda de subcadenas (LIKE %FirstMidName% or
LIKE %LastName%) que busca los nombre y apellidos por lo que se escribe en el cuadro de texto.
Ejecutar la página. Inicialmente verás todos los estudiantes porque el valor predeterminado para el
parámetroStudentName es "%".

Escriba la letra "g" en el cuadro de texto y haga clic en Buscar. Verá una lista de estudiantes que tienen
una "g" ya sea en el nombre o apellido.

Has ahora aparece, actualizado, filtrado, ordenado y agrupar datos de tablas individuales. En el siguiente
tutorial comenzará a trabajar con datos relacionados (principal-detalle escenarios).
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 4
Por Tom Dykstra|03 de diciembre de 2010
Imprimir

La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie

Trabajar con datos relacionados


En el tutorial anterior se utiliza el control EntityDataSource para filtro, clasificación y datos del grupo. En
este tutorial usted podrá visualizar y actualizar datos relacionados.
Crearás la página instructores que muestra una lista de instructores. Cuando se selecciona un instructor,
verás una lista de cursos impartidos por el instructor. Cuando se selecciona un curso, ver detalles del curso
y una lista de alumnos matriculados en el curso. Puede editar el nombre del instructor, fecha de
contratación y asignación de la oficina. La asignación de la oficina es un conjunto de entidad separada que
se puede acceder mediante una propiedad de navegación.
Se pueden enlazar datos maestros con datos de detalle en el marcado o en código. En esta parte del
tutorial, deberá usar ambos métodos.

Visualización y actualización de las entidades vinculadas


en un Control GridView
Crear una nueva página web denominada Instructors.aspx que utiliza la Página principal Site.Master y
agregue el siguiente marcado para el control de Content llamado Content2:
<h2>Instructors</h2>
<div>
<asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People"
Where="it.HireDate is not null" Include="OfficeAssignment"
EnableUpdate="True">
</asp:EntityDataSource>
</div>
Este marcado crea un control EntityDataSource que selecciona instructores y permite actualizaciones. El
elementodiv configura marcado para representar a la izquierda para que más tarde puede agregar una
columna a la derecha.
Entre el marcado EntityDataSource y el cierre </div> tag, agregue el marcado siguiente que crea un
controlGridView y un control Label que usarás para los mensajes de error:
<asp:GridView ID="InstructorsGridView" runat="server" AllowPaging="True"
AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="PersonID"
DataSourceID="InstructorsEntityDataSource"
OnSelectedIndexChanged="InstructorsGridView_SelectedIndexChanged"
SelectedRowStyle-BackColor="LightGray"
onrowupdating="InstructorsGridView_RowUpdating">
<Columns>
<asp:CommandField ShowSelectButton="True" ShowEditButton="True" />
<asp:TemplateField HeaderText="Name" SortExpression="LastName">
<ItemTemplate>
<asp:Label ID="InstructorLastNameLabel" runat="server"
Text='<%# Eval("LastName") %>'></asp:Label>,
<asp:Label ID="InstructorFirstNameLabel" runat="server"
Text='<%# Eval("FirstMidName") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="InstructorLastNameTextBox" runat="server"
Text='<%# Bind("FirstMidName") %>' Width="7em"></asp:TextBox>
<asp:TextBox ID="InstructorFirstNameTextBox" runat="server"
Text='<%# Bind("LastName") %>' Width="7em"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Hire Date" SortExpression="HireDate">
<ItemTemplate>
<asp:Label ID="InstructorHireDateLabel" runat="server"
Text='<%# Eval("HireDate", "{0:d}") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="InstructorHireDateTextBox" runat="server"
Text='<%# Bind("HireDate", "{0:d}") %>' Width="7em"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Office Assignment"
SortExpression="OfficeAssignment.Location">
<ItemTemplate>
<asp:Label ID="InstructorOfficeLabel" runat="server"
Text='<%# Eval("OfficeAssignment.Location") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="InstructorOfficeTextBox" runat="server"
Text='<%# Eval("OfficeAssignment.Location") %>' Width="7em"
oninit="InstructorOfficeTextBox_Init"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
</Columns>
<SelectedRowStyle BackColor="LightGray"></SelectedRowStyle>
</asp:GridView>
<asp:Label ID="ErrorMessageLabel" runat="server" Text="" Visible="false"
ViewStateMode="Disabled"></asp:Label>

Este control GridView permite la selección de filas, destaca la fila seleccionada con un color de fondo gris
claro y especifica los controladores (que crearás más adelante) para los
eventos SelectedIndexChanged y Updating .También especifica PersonID para la
propiedad DataKeyNames , así el valor de la clave de la fila seleccionada puede pasarse a otro control que
añadiremos más tarde.
La última columna contiene la asignación, del instructor oficina, que se almacena en una propiedad de
navegación de la entidad Person porque se trata de una entidad asociada. Observe que el
elemento EditItemTemplateespecifica Eval en lugar de Bind, porque el control GridView no se puede
enlazar directamente a las propiedades de navegación para actualizarlos. Usted podrá actualizar la
asignación de la oficina en el código. Para ello, necesitará una referencia al control TextBox , y podrá
conseguir y guarde en el evento Init del control TextBox .
Tras el control GridView es un control de Label que se utiliza para los mensajes de
error. Propiedad Visible del control es false, y el estado de vista está apagado, para que la etiqueta
aparecerá sólo cuando código hace visible en respuesta a un error.
Abra el archivo Instructors.aspx.cs y agregue la siguiente instrucción using :
using ContosoUniversity.DAL;
Agregar un campo de clase privada inmediatamente después de la declaración de clase parcial nombre
para mantener una referencia a la casilla de texto asignación.

private TextBox instructorOfficeTextBox;


Agregue un trozo para el controlador del evento SelectedIndexChanged que podrás agregar código
para más tarde. También agregar un controlador para el evento Init del Oficina
asignación TextBox control así que usted puede almacenar una referencia al control TextBox . Utilizarás
esta referencia para obtener el valor introducido para actualizar la entidad asociada a la propiedad de
navegación del usuario.
protected void InstructorsGridView_SelectedIndexChanged(object sender,
EventArgs e)
{
}

protected void InstructorOfficeTextBox_Init(object sender, EventArgs e)


{
instructorOfficeTextBox = sender as TextBox;
}
Evento de Updating del control GridView utilizará para actualizar la propiedad Location de la entidad
asociadaOfficeAssignment . Agregue el siguiente controlador para el evento de Updating :
protected void InstructorsGridView_RowUpdating(object sender,
GridViewUpdateEventArgs e)
{
using (var context = new SchoolEntities())
{
var instructorBeingUpdated = Convert.ToInt32(e.Keys[0]);
var officeAssignment = (from o in context.OfficeAssignments
where o.InstructorID ==
instructorBeingUpdated
select o).FirstOrDefault();

try
{
if (String.IsNullOrWhiteSpace(instructorOfficeTextBox.Text) ==
false)
{
if (officeAssignment == null)
{

context.OfficeAssignments.AddObject(OfficeAssignment.CreateOfficeAssignment(instructo
rBeingUpdated, instructorOfficeTextBox.Text, null));
}
else
{
officeAssignment.Location = instructorOfficeTextBox.Text;
}
}
else
{
if (officeAssignment != null)
{
context.DeleteObject(officeAssignment);
}
}
context.SaveChanges();
}
catch (Exception)
{
e.Cancel = true;
ErrorMessageLabel.Visible = true;
ErrorMessageLabel.Text = "Update failed.";
//Add code to log the error.
}
}
}
Este código se ejecuta cuando el usuario hace clic en Actualizar en la fila de un GridView . El código
utiliza LINQ to Entities para recuperar la entidad OfficeAssignment que está asociado con la entidad
de Person actual, utilizando el PersonID de la fila seleccionada de la discusión del evento.
El código entonces realiza una de las siguientes acciones dependiendo del valor en el control
deInstructorOfficeTextBox :
 Si el cuadro de texto tiene un valor y no hay ninguna entidad OfficeAssignment para actualizar,
crea uno.
 Si el cuadro de texto tiene un valor y no hay una entidad OfficeAssignment , actualiza el valor de la
propiedad Location .
 Si el cuadro de texto está vacío y existe una entidad OfficeAssignment , elimina la entidad.
Después de esto, salva los cambios a la base de datos. Si se produce una excepción, muestra un mensaje
de error.
Ejecutar la página.

Haga clic en Editar y todos los campos cambian a cuadros de texto.


Cambiar cualquiera de estos valores, incluyendo la Asignación de la oficina. Haga clic en Actualizar y
verás los cambios reflejados en la lista.

Mostrar entidades relacionadas en un Control separado


Cada instructor puede enseñar uno o más cursos, así que añadiremos un control EntityDataSource y un
controlGridView para listar los cursos asociados a cualquier instructor es seleccionado en el
control GridView de instructores. Para crear una dirección y el control EntityDataSource para entidades
cursos, agregue el marcado siguiente entre el control de Label de mensaje de error y el
cierre </div> etiqueta:
<h3>Courses Taught</h3>
<asp:EntityDataSource ID="CoursesEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="Courses"
Where="@PersonID IN (SELECT VALUE instructor.PersonID FROM it.People AS
instructor)">
<WhereParameters>
<asp:ControlParameter ControlID="InstructorsGridView" Type="Int32"
Name="PersonID" PropertyName="SelectedValue" />
</WhereParameters>
</asp:EntityDataSource>
El parámetro Where contiene el valor de la PersonID del instructor cuya fila está seleccionada en el
control deInstructorsGridView . La propiedad Where contiene un comando subselect que obtiene
todas las entidades asociadas de Person de People y selecciona la entidad Course sólo si una de las
entidades asociadas de Personcontiene el valor seleccionado PersonID .
Para crear el control GridView ., agregue el marcado siguiente inmediatamente después del control
deCoursesEntityDataSource (antes del cierre </div> etiqueta):
<asp:GridView ID="CoursesGridView" runat="server"
DataSourceID="CoursesEntityDataSource"
AllowSorting="True" AutoGenerateColumns="False"
SelectedRowStyle-BackColor="LightGray"
DataKeyNames="CourseID">
<EmptyDataTemplate>
<p>No courses found.</p>
</EmptyDataTemplate>
<Columns>
<asp:CommandField ShowSelectButton="True" />
<asp:BoundField DataField="CourseID" HeaderText="ID" ReadOnly="True"
SortExpression="CourseID" />
<asp:BoundField DataField="Title" HeaderText="Title"
SortExpression="Title" />
<asp:TemplateField HeaderText="Department"
SortExpression="DepartmentID">
<ItemTemplate>
<asp:Label ID="GridViewDepartmentLabel" runat="server"
Text='<%# Eval("Department.Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Porque no hay cursos se desplegará si no se ha seleccionado ningún instructor, se incluye un
elementoEmptyDataTemplate .
Ejecutar la página.

Seleccione un instructor que tiene uno o más cursos asignados, y el curso o cursos que aparecen en la
lista. (Nota: Aunque el esquema de base de datos permite múltiples cursos, en los datos de prueba
suministrados con la base de datos instructor en realidad no tiene más de un curso. Usted puede agregar
cursos a la base de datos usando la ventana del Explorador de servidores o en la
página CoursesAdd.aspx , que añadiremos en un tutorial más adelante.)
El control CoursesGridView muestra sólo unos pocos campos de curso. Para mostrar todos los detalles
para un curso, que utilizará un control DetailsView para el curso que el usuario
selecciona. En Instructors.aspx, agregue el marcado siguiente después del cierre </div> etiqueta
(Asegúrese de colocar este marcado después de que el div de cierre de la etiqueta, no antes):
<div>
<h3>Course Details</h3>
<asp:EntityDataSource ID="CourseDetailsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="Courses"
AutoGenerateWhereClause="False" Where="it.CourseID = @CourseID"
Include="Department,OnlineCourse,OnsiteCourse,StudentGrades.Person"
OnSelected="CourseDetailsEntityDataSource_Selected">
<WhereParameters>
<asp:ControlParameter ControlID="CoursesGridView" Type="Int32"
Name="CourseID" PropertyName="SelectedValue" />
</WhereParameters>
</asp:EntityDataSource>
<asp:DetailsView ID="CourseDetailsView" runat="server"
AutoGenerateRows="False"
DataSourceID="CourseDetailsEntityDataSource">
<EmptyDataTemplate>
<p>
No course selected.</p>
</EmptyDataTemplate>
<Fields>
<asp:BoundField DataField="CourseID" HeaderText="ID" ReadOnly="True"
SortExpression="CourseID" />
<asp:BoundField DataField="Title" HeaderText="Title"
SortExpression="Title" />
<asp:BoundField DataField="Credits" HeaderText="Credits"
SortExpression="Credits" />
<asp:TemplateField HeaderText="Department">
<ItemTemplate>
<asp:Label ID="DetailsViewDepartmentLabel" runat="server"
Text='<%# Eval("Department.Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Location">
<ItemTemplate>
<asp:Label ID="LocationLabel" runat="server" Text='<%#
Eval("OnsiteCourse.Location") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="URL">
<ItemTemplate>
<asp:Label ID="URLLabel" runat="server" Text='<%#
Eval("OnlineCourse.URL") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Fields>
</asp:DetailsView>
</div>
Este marcado crea un control EntityDataSource que está enlazado con el conjunto de entidades
de Courses . La propiedad Where selecciona un curso utilizando el valor del CourseID de la fila
seleccionada en el control GridViewcursos. El marcado especifica un controlador para el
evento Selected , que utilizará más tarde para la visualización de calificaciones de los estudiantes, que es
otro nivel más bajo en la jerarquía.
En Instructors.aspx.cs, cree el siguiente trozo para el
método CourseDetailsEntityDataSource_Selected .(Podrás llenar este trozo más adelante en el
tutorial, por ahora, lo necesitas para que la página se compila y ejecuta).
protected void CourseDetailsEntityDataSource_Selected(object sender,
EntityDataSourceSelectedEventArgs e)
{
}
Ejecutar la página.

Inicialmente hay no hay detalles del curso porque no se ha seleccionado ningún curso. Seleccione un
instructor que tiene un curso asignado y a continuación, seleccione un curso para ver los detalles.
Usando el EntityDataSource "seleccionado" evento para
Mostrar datos relacionados
Por último, quieres Mostrar todos los alumnos y sus calificaciones para el curso seleccionado. Para ello,
utilizará el evento Selected del control EntityDataSource atado al curso DetailsView.
En Instructors.aspx, agregue el marcado siguiente después del control DetailsView :
<h3>Student Grades</h3>
<asp:ListView ID="GradesListView" runat="server">
<EmptyDataTemplate>
<p>No student grades found.</p>
</EmptyDataTemplate>
<LayoutTemplate>
<table border="1" runat="server" id="itemPlaceholderContainer">
<tr runat="server">
<th runat="server">
Name
</th>
<th runat="server">
Grade
</th>
</tr>
<tr id="itemPlaceholder" runat="server">
</tr>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td>
<asp:Label ID="StudentLastNameLabel" runat="server" Text='<%#
Eval("Person.LastName") %>' />,
<asp:Label ID="StudentFirstNameLabel" runat="server"
Text='<%# Eval("Person.FirstMidName") %>' />
</td>
<td>
<asp:Label ID="StudentGradeLabel" runat="server" Text='<%#
Eval("Grade") %>' />
</td>
</tr>
</ItemTemplate>
</asp:ListView>
Este marcado crea un control ListView que muestra una lista de los alumnos y sus calificaciones para el
curso seleccionado. Ningún origen de datos especificado porque tendrás databind del control en el
código. El elementoEmptyDataTemplate proporciona un mensaje que se mostrará cuando no se ha
seleccionado ningún curso — en ese caso, no hay ningún estudiante para mostrar. El
elemento LayoutTemplate crea una tabla HTML para mostrar la lista y la ItemTemplate especifica las
columnas para mostrar. El ID del estudiante y el grado del estudiante son de la entidad StudentGrade , y
el nombre del estudiante es de la entidad de la Person que pone a disposición de la propiedad de
navegación de la Person de la entidad StudentGrade Entity Framework.
En Instructors.aspx.cs, reemplace el método de CourseDetailsEntityDataSource_Selected de golpear
con el siguiente código:
protected void CourseDetailsEntityDataSource_Selected(object sender,
EntityDataSourceSelectedEventArgs e)
{
var course = e.Results.Cast<Course>().FirstOrDefault();
if (course != null)
{
var studentGrades = course.StudentGrades.ToList();
GradesListView.DataSource = studentGrades;
GradesListView.DataBind();
}
}
El argumento de evento para este evento proporciona los datos seleccionados en la forma de una
colección, que tendrá cero elementos si no se selecciona o un artículo si se selecciona una entidad
de Course . Si se selecciona una entidad de Course , el código utiliza el First método para convertir la
colección en un objeto único. A continuación obtiene entidades StudentGrade de la propiedad de
navegación, convierte a una colección y enlaza el controlGradesListView a la colección.
Esto es suficiente Mostrar grados, pero quiere asegurarse de que el mensaje en la plantilla de datos vacía
se muestra la primera vez que aparece la página y cuando no se selecciona un curso. Para ello, cree el
siguiente método, que se podrá llamar desde dos lugares:
private void ClearStudentGradesDataSource()
{
var emptyStudentGradesList = new List<StudentGrade>();
GradesListView.DataSource = emptyStudentGradesList;
GradesListView.DataBind();
}
Llame a este nuevo método del método Page_Load para mostrar la hora de la primera plantilla de datos
vacía que se muestra la página. Y llamarlo desde el
método InstructorsGridView_SelectedIndexChanged porque ese evento se produce cuando se
selecciona un instructor, que significa nuevos cursos se cargan en el control GridViewcursos y ninguno se
ha seleccionado todavía. Aquí están las dos llamadas:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ClearStudentGradesDataSource();
}
}
protected void InstructorsGridView_SelectedIndexChanged(object sender,
EventArgs e)
{
ClearStudentGradesDataSource();
}
Ejecutar la página.

Seleccione un instructor que tiene un curso asignado y seleccione el curso.


Ahora hemos visto algunas formas de trabajar con datos relacionados. En el siguiente tutorial, usted
aprenderá cómo agregar las relaciones entre las entidades existentes, cómo quitar las relaciones y cómo
agregar una nueva entidad que tiene una relación con una entidad existente.
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 5
Por Tom Dykstra|03 de diciembre de 2010
Imprimir

La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie

Continuó trabajando con datos relacionados,


En el tutorial anterior empezó a utilizar el control EntityDataSource para trabajar con datos
relacionados. Muestra varios niveles de jerarquía y había editado los datos en las propiedades de
navegación. En este tutorial se continuará trabajando con datos relacionados añadiendo y borrando las
relaciones y mediante la adición de una nueva entidad que tiene una relación con una entidad existente.
Crearás una página que añade cursos que se asignan a los departamentos. Los departamentos ya existen,
y cuando se crea un nuevo rumbo, al mismo tiempo usted podrá establecer una relación entre él y un
departamento existente.

También crearás una página que trabaja con una relación muchos-a-muchos mediante la asignación de un
instructor de un curso (añadiendo una relación entre dos entidades que selecciona) o quitar un instructor
de un curso (eliminación de una relación entre dos entidades que se selecciona). En la base de datos,
agregando una relación entre un instructor y un curso en una nueva fila se agrega a la tabla de Asociación
de CourseInstructor ; quitar una relación consiste en eliminar una fila de la tabla de Asociación
de CourseInstructor . Sin embargo, haces esto en Entity Framework estableciendo las propiedades de
navegación, sin referirse explícitamente a la tablaCourseInstructor .
Adición de una entidad con una relación con una entidad
existente
Crear una nueva página web denominada CoursesAdd.aspx que utiliza la Página principal Site.Master y
agregue el siguiente marcado para el control de Content llamado Content2:
<h2>Add Courses</h2>
<asp:EntityDataSource ID="CoursesEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="Courses"
EnableInsert="True" EnableDelete="True" >
</asp:EntityDataSource>
<asp:DetailsView ID="CoursesDetailsView" runat="server" AutoGenerateRows="False"
DataSourceID="CoursesEntityDataSource" DataKeyNames="CourseID"
DefaultMode="Insert" oniteminserting="CoursesDetailsView_ItemInserting">
<Fields>
<asp:BoundField DataField="CourseID" HeaderText="ID" />
<asp:BoundField DataField="Title" HeaderText="Title" />
<asp:BoundField DataField="Credits" HeaderText="Credits" />
<asp:TemplateField HeaderText="Department">
<InsertItemTemplate>
<asp:EntityDataSource ID="DepartmentsEntityDataSource"
runat="server" ConnectionString="name=SchoolEntities"
DefaultContainerName="SchoolEntities" EnableDelete="True"
EnableFlattening="False"
EntitySetName="Departments" EntityTypeFilter="Department">
</asp:EntityDataSource>
<asp:DropDownList ID="DepartmentsDropDownList" runat="server"
DataSourceID="DepartmentsEntityDataSource"
DataTextField="Name" DataValueField="DepartmentID"
oninit="DepartmentsDropDownList_Init">
</asp:DropDownList>
</InsertItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowInsertButton="True" />
</Fields>
</asp:DetailsView>
Este marcado crea un control EntityDataSource que selecciona cursos, que permite insertar y que
especifica un controlador para el evento de Inserting . Utilizarás el controlador para actualizar
el Department propiedad de navegación cuando se crea una nueva entidad de Course .
El marcado también crea un control DetailsView para agregar nuevas entidades de Course . El marcado
utiliza campos enlazados por Course propiedades de entidad. Tienes que introducir el valor
de CourseID porque esto no es un campo generado por el sistema de identificación. En cambio, es un
número del curso que debe especificarse manualmente cuando se crea el curso.
Utilice un campo de plantilla para la propiedad de navegación Department porque las propiedades de
navegación no pueden utilizarse con controles BoundField . El campo plantilla proporciona una lista
desplegable para seleccionar el departamento. La lista desplegable está ligada a la entidad
de Departments establecer usando Evalen lugar de Bind, otra vez porque usted no puede enlazar
directamente las propiedades de navegación para actualizarlos. Especifica un controlador para el
evento Init del control DropDownList para que usted puede almacenar una referencia al control para su
uso por el código que actualiza la clave externa DepartmentID .
En CoursesAdd.aspx.cs justo después de la declaración de clase parcial, agregar un campo de clase que
contenga una referencia al control DepartmentsDropDownList :
private DropDownList departmentDropDownList;
Agregar un controlador para el evento Init del control DepartmentsDropDownList para que usted
puede almacenar una referencia al control. Esto le permite obtener el valor que el usuario ha introducido y
utilizarlo para actualizar el valor DepartmentID de la entidad de Course .
protected void DepartmentsDropDownList_Init(object sender, EventArgs e)
{
departmentDropDownList = sender as DropDownList;
}
Agregar un controlador para el evento del control DetailsView Inserting :
protected void CoursesDetailsView_ItemInserting(object sender,
DetailsViewInsertEventArgs e)
{
var departmentID = Convert.ToInt32(departmentDropDownList.SelectedValue);
e.Values["DepartmentID"] = departmentID;
}
Cuando el usuario hace clic en Insert, se provoca el evento de Inserting antes de inserta el nuevo
récord. El código en el controlador recibe el DepartmentID del control DropDownList y lo utiliza para
establecer el valor que se utilizará para la propiedad DepartmentID de la entidad de Course .
Entity Framework se ocupará de agregar este curso a la propiedad de navegación de Courses de la
entidad asociada del Department . El Departamento también agrega a la propiedad de navegación
del Department de la entidad deCourse .
Ejecutar la página.
Introduzca un ID, un título, un número de créditos y seleccione un departamento, luego haga clic
en Insertar.
Ejecutar la página Courses.aspx y seleccione el mismo departamento para ver el nuevo curso.

Trabajar con relaciones muchos-a-muchos


La relación entre el conjunto de entidades de Courses y el conjunto de entidades de People es una
relación de varios a varios. Una entidad de Course tiene una propiedad de navegación
llamada People que puede contener cero, uno o más Person entidades (representando a instructores
asignados para impartir el curso). Y una entidadPerson tiene una propiedad de navegación
denominada Courses que puede contener cero, uno o más Courseentidades (representando el instructor
asignado para enseñar cursos). Un instructor puede enseñar cursos múltiples, y un curso puede ser
impartido por instructores múltiples. En esta sección del tutorial, podrá añadir y quitar las relaciones entre
las entidades Person y Course mediante la actualización de las propiedades de navegación de las
entidades relacionadas.
Crear una nueva página web denominada InstructorsCourses.aspx que utiliza la Página
principal Site.Master y agregue el siguiente marcado para el control de Content llamado Content2:
<h2>Assign Instructors to Courses or Remove from Courses</h2>
<br />
<asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People"
Where="it.HireDate is not null" Select="it.LastName + ', ' + it.FirstMidName
AS Name, it.PersonID">
</asp:EntityDataSource>
Select an Instructor:
<asp:DropDownList ID="InstructorsDropDownList" runat="server"
DataSourceID="InstructorsEntityDataSource"
AutoPostBack="true" DataTextField="Name" DataValueField="PersonID"
OnSelectedIndexChanged="InstructorsDropDownList_SelectedIndexChanged"
OnDataBound="InstructorsDropDownList_DataBound">
</asp:DropDownList>
<h3>
Assign a Course</h3>
<br />
Select a Course:
<asp:DropDownList ID="UnassignedCoursesDropDownList" runat="server"
DataTextField="Title" DataValueField="CourseID">
</asp:DropDownList>
<br />
<asp:Button ID="AssignCourseButton" runat="server" Text="Assign"
OnClick="AssignCourseButton_Click" />
<br />
<asp:Label ID="CourseAssignedLabel" runat="server" Visible="false"
Text="Assignment successful"></asp:Label>
<br />
<h3>
Remove a Course</h3>
<br />
Select a Course:
<asp:DropDownList ID="AssignedCoursesDropDownList" runat="server"
DataTextField="title" DataValueField="courseiD">
</asp:DropDownList>
<br />
<asp:Button ID="RemoveCourseButton" runat="server" Text="Remove"
OnClick="RemoveCourseButton_Click" />
<br />
<asp:Label ID="CourseRemovedLabel" runat="server" Visible="false" Text="Removal
successful"></asp:Label>
Este marcado crea un control EntityDataSource que recupera el nombre y la PersonID de
entidades Person para instructores. Un DropDrownList control está enlazado al
control EntityDataSource . El control DropDownListespecifica un controlador para el
evento DataBound . Utilizarás este controlador a databind las dos listas que muestran cursos.
El marcado también crea el siguiente grupo de controles para asignar un curso al instructor seleccionado:

 Un control DropDownList para seleccionar un curso para asignar. Este control se popularán con los
cursos que actualmente no están asignados al instructor seleccionado.
 Un control de Button para iniciar la tarea.
 Un control Label para mostrar un mensaje de error si falla la asignación.
Finalmente, el marcado también crea un grupo de controles para quitar un curso de instructor
seleccionado.

En InstructorsCourses.aspx.cs, agregue un uso declaración:


using ContosoUniversity.DAL;
Agregue un método para rellenar las dos listas desplegables que muestran cursos:

private void PopulateDropDownLists()


{
using (var context = new SchoolEntities())
{
var allCourses = (from c in context.Courses
select c).ToList();

var instructorID =
Convert.ToInt32(InstructorsDropDownList.SelectedValue);
var instructor = (from p in context.People.Include("Courses")
where p.PersonID == instructorID
select p).First();

var assignedCourses = instructor.Courses.ToList();


var unassignedCourses =
allCourses.Except(assignedCourses.AsEnumerable()).ToList();

UnassignedCoursesDropDownList.DataSource = unassignedCourses;
UnassignedCoursesDropDownList.DataBind();
UnassignedCoursesDropDownList.Visible = true;

AssignedCoursesDropDownList.DataSource = assignedCourses;
AssignedCoursesDropDownList.DataBind();
AssignedCoursesDropDownList.Visible = true;
}
}
Este código obtiene todos los cursos desde el conjunto de entidades Courses y recibe los cursos de la
propiedad de navegación de Courses de la entidad de Person para el instructor seleccionado. A
continuación, determina qué cursos son asignados a ese instructor y rellena las listas desplegables en
consecuencia.
Agregar un controlador para el evento Click del botón Assign :
protected void AssignCourseButton_Click(object sender, EventArgs e)
{
using (var context = new SchoolEntities())
{
var instructorID =
Convert.ToInt32(InstructorsDropDownList.SelectedValue);
var instructor = (from p in context.People
where p.PersonID == instructorID
select p).First();
var courseID =
Convert.ToInt32(UnassignedCoursesDropDownList.SelectedValue);
var course = (from c in context.Courses
where c.CourseID == courseID
select c).First();
instructor.Courses.Add(course);
try
{
context.SaveChanges();
PopulateDropDownLists();
CourseAssignedLabel.Text = "Assignment successful.";
}
catch (Exception)
{
CourseAssignedLabel.Text = "Assignment unsuccessful.";
//Add code to log the error.
}
CourseAssignedLabel.Visible = true;
}
}
Este código obtiene la entidad Person para el instructor seleccionado, obtiene la entidad del Course del
curso seleccionado y agrega la propiedad de navegación Courses de entidad de Person del instructor del
curso seleccionado. Luego guarda los cambios a la base de datos y vuelve a llenar las listas desplegables
para que los resultados pueden verse inmediatamente.
Agregar un controlador para el evento Click del botón Remove :
protected void RemoveCourseButton_Click(object sender, EventArgs e)
{
using (var context = new SchoolEntities())
{
var instructorID =
Convert.ToInt32(InstructorsDropDownList.SelectedValue);
var instructor = (from p in context.People
where p.PersonID == instructorID
select p).First();
var courseID =
Convert.ToInt32(AssignedCoursesDropDownList.SelectedValue);
var courses = instructor.Courses;
var courseToRemove = new Course();
foreach (Course c in courses)
{
if (c.CourseID == courseID)
{
courseToRemove = c;
break;
}
}
try
{
courses.Remove(courseToRemove);
context.SaveChanges();
PopulateDropDownLists();
CourseRemovedLabel.Text = "Removal successful.";
}
catch (Exception)
{
CourseRemovedLabel.Text = "Removal unsuccessful.";
//Add code to log the error.
}
CourseRemovedLabel.Visible = true;
}
}
Este código obtiene la entidad Person para el instructor seleccionado, obtiene la entidad del Course del
curso seleccionado y elimina del curso seleccionado de propiedad de la
entidad Person Courses navegación. Luego guarda los cambios a la base de datos y vuelve a llenar las
listas desplegables para que los resultados pueden verse inmediatamente.
Agregue código al método Page_Load que asegura que los mensajes de error no son visibles cuando no
hay ningún error para informar y agregar controladores para que los eventos SelectedIndexChanged de
la lista desplegable de instructores y DataBound rellenar las listas desplegables de cursos:
protected void Page_Load(object sender, EventArgs e)
{
CourseAssignedLabel.Visible = false;
CourseRemovedLabel.Visible = false;
}

protected void InstructorsDropDownList_DataBound(object sender, EventArgs e)


{
PopulateDropDownLists();
}

protected void InstructorsDropDownList_SelectedIndexChanged(object sender,


EventArgs e)
{
PopulateDropDownLists();
}
Ejecutar la página.
Seleccione un instructor. La lista desplegable asignar un curso muestra los cursos que no enseña el
instructor, y la lista desplegable quitar un curso de los cursos que el instructor ya está asignado a. En la
sección asignar un curso , seleccione un curso y haga clic en asignar. El curso se mueve a la lista
desplegable quitar un curso . Seleccione un curso en la sección de quitar un curso y haga clic
en quitar. El curso se mueve a la lista desplegable asignar un curso .
Ahora hemos visto algunos más maneras de trabajar con datos relacionados. En el siguiente tutorial,
aprenderá cómo usar herencia en el modelo de datos para mejorar la capacidad de mantenimiento de la
aplicación
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 6
Por Tom Dykstra|03 de diciembre de 2010
Imprimir

La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie

Implementación de herencia de tabla por jerarquía


En el tutorial anterior trabajaste con datos relacionados añadiendo y borrando las relaciones y mediante la
adición de una nueva entidad que tuvo una relación con una entidad existente. Este tutorial le mostrará
cómo implementar la herencia en el modelo de datos.
En la programación orientada a objetos, puede utilizar herencia para hacerlo más fácil trabajar con las
clases relacionadas. Por ejemplo, puede crear Instructor y Student las clases que derivan de una clase
base Person .Puede crear el mismo tipo de estructuras de herencia entre entidades en Entity Framework.
En esta parte del tutorial, usted no creará ningún nuevas páginas web. En cambio, podrá agregar
derivados de entidades en el modelo de datos y modificar las páginas existentes para utilizar las nuevas
entidades.

Tabla por jerarquía frente a la herencia de tabla por tipo


Una base de datos puede almacenar información acerca de los objetos relacionados en una tabla o varias
tablas. Por ejemplo, en la School base de datos, la tabla Person incluye información sobre los estudiantes
y profesores en una sola tabla. Algunas de las columnas se aplican sólo a los instructores (HireDate), sólo
a los estudiantes (EnrollmentDate) y algunos a ambos (LastName, FirstName).

Puede configurar el Entity Framework para crear Instructor y Student entidades que heredan de la
entidadPerson . Este patrón de generar una estructura de herencia de entidad de una tabla de base de
datos se denomina herencia de tabla por jerarquía (TPH).
Para los cursos, la School base de datos utiliza un patrón diferente. Cursos en línea y en el sitio se
almacenan en tablas separadas, cada una de ellas tiene una clave externa que apunta a la
tabla Course . Información común a ambos tipos de cursos se almacena solamente en la tabla Course .
Puede configurar el modelo de datos de Entity Framework para que las
entidades OnlineCourse y OnsiteCourseheredan de la entidad de Course . Este patrón de generar una
estructura de herencia de entidad de mesas separadas para cada tipo, con cada mesa separada
refiriéndose a una tabla que almacena los datos comunes a todos los tipos, se denomina herencia de tabla
por tipo (TPT).
Los patrones de herencia TPH generalmente ofrecen mejor rendimiento en Entity Framework que los
patrones de herencia TPT, porque pueden producir patrones de TPT en consultas complejas unen. En este
tutorial se muestra cómo implementar la herencia de TPH. Harás realizando los siguientes pasos:
 Crear tipos de entidad de Instructor y los Student que se derivan de la Person.
 Mover propiedades que pertenecen a las entidades derivadas de la entidad de Person a las
entidades derivadas.
 Definir restricciones sobre las propiedades de los tipos derivados.
 La entidad Person hacer un ente abstracto.
 Mapa de cada entidad derivada a la mesa de la Person con una condición que especifica cómo
determinar si una Person fila representa ese tipo derivado.

Adición de Instructor y estudiante entidades


Abra el archivo SchoolModel.edmx , haga clic derecho en un área desocupado en el diseñador,
seleccione Agregary seleccionar entidad.
En el cuadro de diálogo Agregar entidad nombre la entidad Instructor y establezca su
opción Tipo Base enPerson.
Haga clic en Aceptar. El diseñador crea una entidad Instructor que deriva de la entidad Person . La
nueva entidad todavía no tiene ninguna propiedad.

Repita el procedimiento para crear una entidad Student que deriva también de la Person.
Sólo los instructores tienen fechas de alquiler, así que tienes que mover esa propiedad de la entidad de
la Person a la entidad Instructor . En la entidad de Person , haga clic derecho en la
propiedad HireDate y haga clic encortar. Luego haga clic derecho en Propiedades en la
entidad Instructor y haga clic en pegar.
La fecha de contratación de una entidad de Instructor no puede ser null. Haga clic derecho en la
propiedadHireDate , haga clic en Propiedadesy luego en la
ventana Propiedades cambiar Nullable en False.

Repita el procedimiento para mover la propiedad EnrollmentDate de la entidad de la Person a la


entidad Student. Asegúrese de que también configurar Nullable en False para la
propiedad EnrollmentDate .
Ahora que una entidad Person tiene sólo las propiedades que son comunes a las
entidades Instructor y Student(aparte de las propiedades de navegación, que no te vas), la entidad
sólo puede utilizarse como una entidad de base en la estructura de herencia. Por lo tanto, debe asegurarse
de que nunca es tratada como una entidad independiente. Haga clic derecho en la entidad de Person ,
seleccione Propiedadesy luego en la ventanaPropiedades cambiar el valor de la
propiedad abstracta en True.

Cartografía de Instructor y estudiante entidades a la tabla


persona
Ahora tienes que decirle el Entity Framework Cómo diferenciar entre Instructor y Student entidades en
la base de datos.
Haga clic derecho en la entidad Instructor y seleccione Tabla
de mapeo. En la ventana
de Detalles de asignación, haga clic en agregar una tabla o vista y seleccione persona.

Haga clic en agregar una condicióny luego seleccione HireDate.


Cambiar de operador a y valor / propiedad no null.

Repita el procedimiento para la entidad de Students , especificando que esta entidad se asigna a la
tabla Personcuando la columna de EnrollmentDate no es null. Guarde y cierre el modelo de datos.
Genere el proyecto con el fin de crear las nuevas entidades como clases y hacerlos disponibles en el
diseñador.

Con el Instructor y estudiante entidades


Al crear las páginas web que funcionan con datos instructor y estudiante, te databound para la
entidad Personestablezca y filtra en la propiedad EnrollmentDate o HireDate para restringir los datos
devueltos a los estudiantes o profesores. Sin embargo, ahora cuando enlazar cada control de origen de
datos para el conjunto de entidadesPerson , puede especificar que tipos de entidad
sólo Student o Instructor deben ser seleccionados. Entity Framework sabe distinguir estudiantes e
instructores en la entidad Person establecen, puede quitar la configuraciónWhere propiedad introducida
manualmente para hacer eso.
En el diseñador de Visual Studio, puede especificar el tipo de entidad que un
control EntityDataSource debe seleccionar en el cuadro de lista desplegable EntityTypeFilter del
asistente para Configure Data Source , como se muestra en el ejemplo siguiente.
Y en la ventana de Propiedades puede quitar Where los valores de cláusula que ya no son necesarios,
como se muestra en el ejemplo siguiente.

Sin embargo, porque has cambiado el marcado para control EntityDataSource se utiliza el
atributoContextTypeName , no puede ejecutar al asistente para Configurar origen de datos en
controlesEntityDataSource que ya ha creado. Por lo tanto, harán que los cambios requeridos por el
cambio marcado en su lugar.
Abra la página Students.aspx . En el control de StudentsEntityDataSource , quitar el atributo Where y
añadir unaEntityTypeFilter="Student" atributo. El marcado ahora parecerá en el siguiente ejemplo:
<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People" EntityTypeFilter="Student"
Include="StudentGrades"
EnableDelete="True" EnableUpdate="True"
OrderBy="it.LastName" >
</asp:EntityDataSource>
Establecer la EntityTypeFilter atributo asegura que el control EntityDataSource seleccionará
únicamente el tipo de entidad especificada. Si quería recuperar los tipos de
entidad Instructor y Student , no se establecería este atributo. (Usted tiene la opción de recuperar
varios tipos de entidad con un solo control EntityDataSourcesolamente si está usando el control de
acceso a datos de sólo lectura. Si estás usando un controlEntityDataSource para insertar, actualizar o
eliminar entidades, y el conjunto de entidades que es obligado puede contener varios tipos, sólo puede
trabajar con el tipo de una sola entidad, y tienes que configurar este atributo.)
Repita el procedimiento para el control de SearchEntityDataSource , excepto extraer solamente la parte
del atributo Where que selecciona las entidades Student en vez de quitar la propiedad en conjunto. La
etiqueta de apertura del control ahora parecerá en el siguiente ejemplo:
<asp:EntityDataSource ID="SearchEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People" EntityTypeFilter="Student"
Where="it.FirstMidName Like '%' + @StudentName + '%' or it.LastName Like '%'
+ @StudentName + '%'" >
Ejecute la página para verificar que todavía funciona como lo hacía antes.
Actualización de las páginas siguientes que creaste en tutoriales anteriores así que utilizan las nuevas
entidadesInstructor y Student en lugar de las entidades de la Person y luego ejecutarlos para verificar
que funcionan como lo hicieron antes:
 En StudentsAdd.aspx, agregue EntityTypeFilter="Student" al
control StudentsEntityDataSource . El marcado ahora parecerá en el siguiente ejemplo:
 <asp:EntityDataSource ID="StudentsEntityDataSource" runat="server"
 ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
 EntitySetName="People" EntityTypeFilter="Student"
 EnableInsert="True"

</asp:EntityDataSource>
 En About.aspx, agregue EntityTypeFilter="Student" a
la StudentStatisticsEntityDataSource de control y quitar Where="it.EnrollmentDate is
not null". El marcado ahora parecerá en el siguiente ejemplo:
 <asp:EntityDataSource ID="StudentStatisticsEntityDataSource" runat="server"
 ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
 EntitySetName="People" EntityTypeFilter="Student"
 Select="it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents"
 OrderBy="it.EnrollmentDate" GroupBy="it.EnrollmentDate" >

</asp:EntityDataSource>

 En Instructors.aspx y InstructorsCourses.aspx, agregue EntityTypeFilter="Instructor" a


laInstructorsEntityDataSource de control y quitar Where="it.HireDate is not null". El
marcado enInstructors.aspx ahora se asemeja del siguiente ejemplo:
 <asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server"
 ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="false"
 EntitySetName="People" EntityTypeFilter="Instructor"
 Include="OfficeAssignment"
 EnableUpdate="True">

</asp:EntityDataSource>
El marcado en InstructorsCourses.aspx ahora parecerá en el siguiente ejemplo:
<asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People" EntityTypeFilter="Instructor"
Select="it.LastName + ',' + it.FirstMidName AS Name, it.PersonID">
</asp:EntityDataSource>
Como resultado de estos cambios, ha mejorado la mantenibilidad de la aplicación Contoso Universidad de
varias maneras. Has movido lógica selección y validación de la capa de interfaz de usuario (.aspx markup) y
lo hizo parte integral de la capa de acceso a datos. Esto ayuda a aislar el código de la aplicación de los
cambios que usted puede hacer en el futuro para el esquema de base de datos o el modelo de datos. Por
ejemplo, usted podría decidir que los estudiantes podrían ser contratados como auxiliares docentes y por
lo tanto tendría una fecha de contratación.Entonces usted podría agregar una nueva propiedad para
diferenciar a los estudiantes de instructores y actualizar el modelo de datos. Ningún código en la
aplicación web tendría que modificar excepto donde querías mostrar una fecha de contratación para los
estudiantes. Otro beneficio de agregar entidades Instructor y Student es que el código es más
fácilmente comprensible que cuando se refiere a Person objetos que eran realmente estudiantes o
profesores.
Ahora has visto una forma de implementar un patrón de herencia en Entity Framework. En el siguiente
tutorial, aprenderá cómo utilizar procedimientos almacenados con el fin de tener más control sobre cómo
el Entity Framework tiene acceso a la base de datos.
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 7
Por Tom Dykstra|03 de diciembre de 2010

Imprimir

La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie

Utilizando procedimientos almacenados


En el tutorial anterior había implementado un patrón de herencia de tabla por jerarquía. Este tutorial le
mostrará cómo usar los procedimientos almacenados para ganar más control sobre el acceso de base de
datos.
Entity Framework permite especificar que se deben utilizar procedimientos almacenados para el acceso de
base de datos. Para cualquier tipo de entidad, puede especificar un procedimiento almacenado para crear,
actualizar o eliminar entidades de ese tipo. En el modelo de datos puede agregar referencias a los
procedimientos almacenados que puede utilizar para realizar tareas como la recuperación de conjuntos de
entidades.
Utilizando procedimientos almacenados es un requisito común para el acceso de base de datos. En
algunos casos puede requerir un administrador de base de datos que van todos los accesos de base de
datos a través de procedimientos almacenados por razones de seguridad. En otros casos quizá quieras
construir la lógica de negocio en algunos de los procesos que Entity Framework utiliza cuando se actualiza
la base de datos. Por ejemplo, cuando se elimina una entidad deberías copiarlo a una base de datos de
archivo. O cuando se actualiza una fila tal vez quieras escribir una fila en una tabla de registro que registra
quién hizo el cambio. Puede realizar este tipo de tareas en un procedimiento almacenado que se llama
cuando Entity Framework permite borrar una entidad o actualizaciones de una entidad.
Al igual que en el tutorial anterior, no crearás las páginas nuevas. En cambio, usted podrá cambiar la forma
Entity Framework tiene acceso a la base de datos para algunas de las páginas ya ha creado.
En este tutorial crearás procedimientos almacenados en la base de datos para insertar las
entidades Instructor yStudent . Podrá añadirlos al modelo de datos, y se podrá especificar que el Entity
Framework deben usarlos para agregar entidades Instructor y Student a la base de datos. También
crearás un procedimiento almacenado que puede utilizar para recuperar el Course las entidades.

Creación de procedimientos almacenados en la base de


datos
(Si estás usando el archivo School.mdf del proyecto disponible para su descarga con este tutorial, puede
omitir esta sección porque ya existen los procedimientos almacenados.)
En el Explorador de servidores, expanda School.mdf, Procedimientos almacenadoscon el
botón derecho y seleccione Agregar nuevo procedimiento almacenado.
Copie las siguientes instrucciones SQL y pegarlos en la ventana del procedimiento almacenado,
sustituyendo el procedimiento almacenado esqueleto.

CREATE PROCEDURE [dbo].[InsertStudent]


@LastName nvarchar(50),
@FirstName nvarchar(50),
@EnrollmentDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
EnrollmentDate)
VALUES (@LastName,
@FirstName,
@EnrollmentDate);
SELECT SCOPE_IDENTITY() as NewPersonID;

Las entidades Student tienen cuatro


propiedades: PersonID, LastName, FirstNamey EnrollmentDate. La base de datos genera
automáticamente el valor de ID, y el procedimiento almacenado acepta parámetros para los otros tres.El
procedimiento almacenado devuelve el valor de la clave de registro de la nueva fila modo que Entity
Framework puede mantener la pista de en la versión de la entidad se mantiene en la memoria.
Guarde y cierre la ventana del procedimiento almacenado.

Crear un procedimiento InsertInstructor almacenados de la misma manera, utilizando las siguientes


sentencias SQL:
CREATE PROCEDURE [dbo].[InsertInstructor]
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
HireDate)
VALUES (@LastName,
@FirstName,
@HireDate);
SELECT SCOPE_IDENTITY() as NewPersonID;
Crear procedimientos de Update almacenados para Instructor y Student entidades también. (La base
de datos ya cuenta con un procedimiento de DeletePerson almacenado que trabajará para entidades
tanto Instructor yStudent ).
CREATE PROCEDURE [dbo].[UpdateStudent]
@PersonID int,
@LastName nvarchar(50),
@FirstName nvarchar(50),
@EnrollmentDate datetime
AS
UPDATE Person SET LastName=@LastName,
FirstName=@FirstName,
EnrollmentDate=@EnrollmentDate
WHERE PersonID=@PersonID;
CREATE PROCEDURE [dbo].[UpdateInstructor]
@PersonID int,
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime
AS
UPDATE Person SET LastName=@LastName,
FirstName=@FirstName,
HireDate=@HireDate
WHERE PersonID=@PersonID;
En este tutorial podrás asignar las tres funciones, insert, update y delete--para cada tipo de entidad. Entity
Framework versión 4 le permite asignar uno o dos de estas funciones a los procedimientos almacenados
sin asignación de los demás, con una excepción: Si asigna la función de actualización, pero no la función
Borrar, Entity Framework producirá una excepción cuando se intenta eliminar una entidad. En Entity
Framework versión 3.5, no ha tenido tanta flexibilidad en la asignación de procedimientos almacenados: Si
usted asigna una función has necesitado para mapear los tres.
Para crear un procedimiento almacenado que Lee actualiza los datos, en lugar de crea uno que selecciona
todas las entidades de Course , utilizando las siguientes sentencias SQL:
CREATE PROCEDURE [dbo].[GetCourses]
AS
SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course

Agregar los procedimientos almacenados para el modelo


de datos
Ahora se definen los procedimientos almacenados en la base de datos, pero ellos deben agregarse el
modelo de datos para que estén disponibles para Entity Framework. Abrir SchoolModel.edmx, haga clic
derecho en la superficie de diseño y seleccionar Un
modelo de actualización de base de
datos. En la opción de Agregar del cuadro de diálogo Elegir su base de datos de objetos ,
ampliar Los procedimientos almacenados, seleccionar los procedimientos almacenados recién
creados y el procedimiento de DeletePerson almacenado y haga clic enFinalizar.
Mapeo de los procedimientos almacenados
En el diseñador del modelo de datos, haga clic derecho en la entidad Student y seleccione Asignación
de procedimiento almacenado.
Aparece la ventana de Detalles de asignación , en el que puede especificar procedimientos
almacenados que debe usar Entity Framework para insertar, actualizar y eliminar entidades de este tipo.

Ajuste la función Insertar InsertStudent. La ventana muestra una lista de parámetros del
procedimiento almacenado, cada uno de los cuales se debe asignar a la propiedad de una entidad. Dos de
éstos se asignan automáticamente porque los nombres son iguales. No hay ninguna entidad propiedad
llamada FirstName, entonces debe seleccionar manualmente FirstMidName de una lista desplegable que
muestra las propiedades disponibles de la entidad. (Esto es porque cambió el nombre de la
propiedad FirstName a FirstMidName en el primer tutorial).
En la misma ventana de Asignación de datos , asignar la función de Update al
procedimiento UpdateStudentalmacenado (Asegúrese de que especifica FirstMidName como el valor del
parámetro para el FirstName, como para la Insert procedimiento almacenado) y la función
de Delete el DeletePerson procedimiento almacenado.

Siga el mismo procedimiento para asignar el insertar, actualizar y eliminar procedimientos almacenados
para instructores de la entidad Instructor .
Para los procedimientos almacenados que leer en lugar de actualizan los datos, utilice la
ventana Explorador de modelos para mapear el procedimiento almacenado que devuelve el tipo de
entidad. En el diseñador del modelo de datos, haga clic derecho en la superficie de diseño y
seleccione Explorador de modelos. Abra el nodoSchoolModel.Store y a continuación, abra el
nodo Stored Procedures . A continuación haga clic derecho en el
procedimiento GetCourses almacenado y seleccione Agregar función de importación.
En el cuadro de diálogo Agregar función de importación bajo devuelve una colección
de seleccionar entidadesy luego seleccione Course como el tipo de entidad devuelto. Cuando haya
terminado, haga clic en Aceptar. Guarde y cierre el archivo .edmx .
Utilizando insertar, actualizar y eliminar procedimientos
almacenados
Procedimientos almacenados para insertar, actualizar y eliminar datos son utilizados por Entity Framework
automáticamente después de haber agregado al modelo de datos y les asignan a las entidades
apropiadas. Ya puedes ejecutar la página StudentsAdd.aspx , y cada vez que se crea una nueva estudiante,
Entity Framework utilizará el procedimiento InsertStudent almacenado para añadir la nueva fila a la
tabla Student .
Ejecute la página Students.aspx y el nuevo alumno aparece en la lista.

Cambie el nombre para comprobar que funciona la función de actualización y a continuación, elimine el
estudiante para comprobar que funciona la función de eliminar.

Utilizando procedimientos almacenados seleccionados


Entity Framework no se ejecuta automáticamente los procedimientos almacenados como GetCourses, y
no los puede utilizar con el control EntityDataSource . Para usarlos, llamarlos desde el código.
Abra el archivo InstructorsCourses.aspx.cs . El método PopulateDropDownLists utiliza una consulta LINQ
a entidades para recuperar todas las entidades de curso para que pueda recorrer la lista y determinar
cuáles se asigna un instructor y cuáles están sin asignar:
var allCourses = (from c in context.Courses
select c).ToList();
Sustituir esto con el siguiente código:
var allCourses = context.GetCourses();
La página utiliza el procedimiento GetCourses almacenados para recuperar la lista de todos los
cursos. Ejecute la página para verificar que funciona como lo hacía antes.
(Propiedades de navegación de entidades obtenidas por un procedimiento almacenado pueden no se
rellena automáticamente con los datos relacionados a esas entidades, dependiendo de la configuración
por defecto deObjectContext . Para más información, consulte Cargar objetos relacionados en MSDN
Library.)
En el siguiente tutorial, aprenderá a utilizar la funcionalidad de datos dinámicos para hacerlo más fácil de
programar y probar datos formato y validación de las reglas. En lugar de especificar en cada página web
reglas tales como cadenas de formato de datos y si es o no un campo requerido, se pueden especificar
dichas normas en los metadatos del modelo de datos y aplican automáticamente en cada página.
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 8
Por Tom Dykstra|03 de diciembre de 2010
Imprimir

La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie

Usando la funcionalidad de datos dinámicos para validar


los datos y el formato
En el tutorial anterior había implementado procedimientos almacenados. Este tutorial le mostrará cómo la
funcionalidad de datos dinámicos puede proporcionar los siguientes beneficios:
 Campos se formatean automáticamente para la exhibición en su tipo de datos base.
 Campos se validan automáticamente basándose en su tipo de datos.
 Puede agregar metadatos para el modelo de datos para personalizar el comportamiento de formato
y validación. Cuando haces esto, usted puede agregar las reglas de formato y validación en un lugar y
aplican automáticamente en todas partes usted acceder a los campos utilizando los controles de
datos dinámicos.
Para ver cómo funciona esto, va a cambiar los controles que se utilizan para mostrar y editar campos en la
página deStudents.aspx existente, y usted podrá agregar metadatos formateo y validación a los campos de
nombre y fecha del tipo de entidad Student .
Mediante DynamicField y control DynamicControl
Abra la página Students.aspx y en el control de StudentsGridView reemplazar los nombre y la Fecha
de inscripción TemplateField elementos con el siguiente marcado:
<asp:TemplateField HeaderText="Name" SortExpression="LastName">
<EditItemTemplate>
<asp:DynamicControl ID="LastNameTextBox" runat="server"
DataField="LastName" Mode="Edit" />
<asp:DynamicControl ID="FirstNameTextBox" runat="server"
DataField="FirstMidName" Mode="Edit" />
</EditItemTemplate>
<ItemTemplate>
<asp:DynamicControl ID="LastNameLabel" runat="server"
DataField="LastName" Mode="ReadOnly" />,
<asp:DynamicControl ID="FirstNameLabel" runat="server"
DataField="FirstMidName" Mode="ReadOnly" />
</ItemTemplate>
</asp:TemplateField>
<asp:DynamicField DataField="EnrollmentDate" HeaderText="Enrollment Date"
SortExpression="EnrollmentDate" />
Este marcado utiliza control DynamicControl en lugar de controles TextBox y Label en el campo
nombre de la plantilla del estudiante, y utiliza un control DynamicField para la fecha de inscripción. No
hay cadenas de formato se especifican.
Agregue un control ValidationSummary después del control StudentsGridView .
<asp:ValidationSummary ID="StudentsValidationSummary" runat="server"
ShowSummary="true"
DisplayMode="BulletList" Style="color: Red" />

En el control SearchGridView Reemplace el marcado para las columnas nombre y Fecha de


inscripción como hiciste en el control de StudentsGridView , pero omite el
elemento EditItemTemplate . El elemento de Columnsdel control SearchGridView ahora contiene el
marcado siguiente:
<asp:TemplateField HeaderText="Name" SortExpression="LastName">
<ItemTemplate>
<asp:DynamicControl ID="LastNameLabel" runat="server"
DataField="LastName" Mode="ReadOnly" />,
<asp:DynamicControl ID="FirstNameLabel" runat="server"
DataField="FirstMidName" Mode="ReadOnly" />
</ItemTemplate>
</asp:TemplateField>
<asp:DynamicField DataField="EnrollmentDate" HeaderText="Enrollment Date"
SortExpression="EnrollmentDate" />
Abra Students.aspx.cs y agregue la siguiente instrucción using :
using ContosoUniversity.DAL;
Agregar un controlador para el evento Init de la página:
protected void Page_Init(object sender, EventArgs e)
{
StudentsGridView.EnableDynamicData(typeof(Student));
SearchGridView.EnableDynamicData(typeof(Student));
}
Este código especifica que los datos dinámicos proporcionará formateo y validación en estos controles
enlazados a datos para los campos de la entidad Student . Si recibe un mensaje de error similar al
ejemplo siguiente cuando ejecute la página, normalmente significa que has olvidado de llamar al
método EnableDynamicData en Page_Init:
Could not determine a MetaTable. A MetaTable could not be determined for the data
source 'StudentsEntityDataSource' and one could not be inferred from the request URL.
Ejecutar la página.
En la columna Fecha de inscripción , el tiempo se muestra junto con la fecha porque el tipo de
propiedad esDateTime. Más tarde lo podrá arreglar.
Por ahora, tenga en cuenta que los datos dinámicos automáticamente proporciona validación de datos
básicos. Por ejemplo, haga clic en Editar, claro que el campo fecha, haga clic en Actualizary ver que
datos dinámicos automáticamente hace esto un campo obligatorio porque el valor no es anulable en el
modelo de datos. La página muestra un asterisco después del campo y un mensaje de error en el
control ValidationSummary :
Se podría omitir el control ValidationSummary , porque también puede mantener el puntero del mouse
sobre el asterisco para ver el mensaje de error:

Datos dinámicos también validará que los datos introducidos en el campo Fecha de inscripción están
una fecha válida:

Como puedes ver, este es un mensaje de error genérico. En la siguiente sección, verá cómo personalizar
los mensajes así como validación y reglas de formato.
Agregar metadatos al modelo de datos
Normalmente, quieres personalizar la funcionalidad proporcionada por datos dinámicos. Por ejemplo,
cambie el modo de visualización de datos y el contenido de los mensajes de error. Es típicamente también
personalizar las reglas de validación de datos para proporcionar más funcionalidad que lo proporciona
datos dinámicos automáticamente basándose en los tipos de datos. Para hacer esto, es crear clases
parciales que corresponden a tipos de entidad.
En el Explorador de soluciones, haga clic derecho en el proyecto ContosoUniversity ,
seleccione Agregar referenciay agregar una referencia
a System.ComponentModel.DataAnnotations.

En la carpeta DAL , crear un nuevo archivo de clase, el nombre Student.csy reemplace el código de plantilla
en él con el siguiente código.
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace ContosoUniversity.DAL
{
[MetadataType(typeof(StudentMetadata))]
public partial class Student
{
}

public class StudentMetadata


{
[DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)]
public DateTime EnrollmentDate { get; set; }

[StringLength(25, ErrorMessage = "First name must be 25 characters or less in


length.")]
[Required(ErrorMessage="First name is required.")]
public String FirstMidName { get; set; }

[StringLength(25, ErrorMessage = "Last name must be 25 characters or less in


length.")]
[Required(ErrorMessage = "Last name is required.")]
public String LastName { get; set; }
}
}
Este código crea una clase parcial para la entidad Student . El atributo MetadataType aplicado a esta
clase parcial identifica la clase que se utiliza para especificar los metadatos. La clase de metadatos puede
tener cualquier nombre, pero usando el nombre de la entidad más "Metadatos" es una práctica común.
Los atributos aplicados a las propiedades de la clase de metadatos especifican formato, los mensajes de
error, reglas y validación. Los atributos que se muestran aquí tendrá los siguientes resultados:
 EnrollmentDate se mostrará como una cita (sin un tiempo).
 Ambos campos nombre deben tener 25 caracteres o menos en longitud y un mensaje de error
personalizado es proporcionado.
 Ambos nombre los campos son obligatorios, y se proporciona un mensaje de error personalizado.
Vuelva a ejecutar la página Students.aspx , y verás que las fechas se muestran ahora sin tiempos:

Editar una fila y tratar de borrar los valores en los campos de nombre. Los asteriscos que indican errores
de campo aparecen tan pronto como se deja un campo, antes de hacer clic en Actualizar. Cuando hace
clic en Update, la página muestra el texto del mensaje de error especificado.
Intente introducir nombres que son más de 25 caracteres, haga clic en Updatey la página muestra el
texto del mensaje de error especificado.

Ahora que ya has engañado estas reglas de formato y validación en los metadatos del modelo de datos,
las reglas se aplicarán automáticamente en cada página que muestra o permite hacer cambios a estos
campos, mientras utilizasDynamicControl o DynamicField controla. Esto reduce la cantidad de código
redundante tienes que escribir, que hace programación y pruebas más fácil, y se asegura de que el
formato de datos y validación son consistentes a través de una aplicación.

Más información
Esto concluye esta serie de tutoriales sobre cómo empezar con Entity Framework. Para más recursos para
ayudarle a aprender cómo usar Entity Framework, continuarcon con el primer tutorial en la siguiente serie
de tutoriales de Entity Framework , o visitan los siguientes sitios:
 Entity Framework FAQ
 El Blog del equipo marco entidad
 Entity Framework en MSDN Library
 Entity Framework en datos MSDN Developer Center
 Resumen de Control de servidor Web EntityDataSource en MSDN Library
 Control EntityDataSource referencia de la API en MSDN Library
 Entidad marco foros de MSDN
 Blog de Julie Lerman

También podría gustarte