Вы находитесь на странице: 1из 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 aplicacin web de Contoso Universidad muestra demuestra cmo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. La aplicacin de ejemplo es un sitio web
para una ficticia Contoso Universidad. Incluye funcionalidades tales como admisin estudiante, curso
creacin y asignaciones de instructor.
El tutorial muestra ejemplos en C#. La muestra descargable contiene cdigo 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 cdigo. Este tutorial es para el primera base de datos. Para obtener ms informacin sobre
las diferencias entre estos flujos de trabajo y orientacin sobre cmo 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 cmo
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 Introduccin a
Entity Framework utilizando ASP.NET MVC.

Versiones de software
Se muestra
en el tutorial

Tambin trabaja con

Windows 7

Windows 8
Visual Studio 2010 Express para Web.

Visual Studio
2010

El tutorial no ha sido probado con versiones anteriores de Visual Studio. Hay muchas
diferencias en las selecciones de men, cuadros de dilogo 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.

Entity
Framework 4

A partir de entidad marco 5, EF usa por defecto la DbContext API que fue introducido
con EF 4.1. El control EntityDataSource fue diseado para
utilizar ObjectContext API.Para obtener ms informacin sobre cmo utilizar el control
EntityDataSource con laDbContext API, vea esta entrada de blog.

Preguntas
Si tienes preguntas que no estn 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 aplicacin que va a construir estos tutoriales es un sitio web simple Universidad.

Los usuarios pueden ver y actualizar informacin de instructor, curso y estudiante. Abajo se muestran
algunas de las pantallas que crears.

Creacin de la aplicacin Web


Para empezar el tutorial, Abra Visual Studio y crear un nuevo proyecto de aplicacin Web ASP.NET
utilizando la plantilla de aplicacin Web ASP.NET :

Esta plantilla crea un proyecto de aplicacin web que ya incluye una hoja de estilos y pginas maestras:

Abre el archivo Site.Master y cambiar "Mi aplicacin ASP.NET" a "Universidad Contoso".


<h1>
Contoso University
</h1>
Encontrar el men de control llamado NavigationMenu y reemplazarlo por el siguiente marcado, que
aade elementos de men para las pginas 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 pgina 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 pgina web con enlaces a las diferentes pginas que podr estar creando:

Crear la base de datos


Para estos tutoriales, utilizar el diseador de modelo de datos de Entity Framework para crear
automticamente 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 diseador generar scripts que crean la base de
datos (el primer modelo de enfoque).
Para el mtodo de primera base de datos utilizado en este tutorial, el siguiente paso es agregar una base
de datos al sitio. La forma ms fcil 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 creacin 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 aplicacin:
%PROGRAMFILES%\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA
(Esta ubicacin del archivo .mdf asume que ests 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 botn derecho y seleccione Agregar nuevo diagrama.

2.

Seleccionar todas las tablas y haga clic en Agregar.

3.

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.
Guardar el diagrama como "SchoolDiagram" y lo cerramos.

Si descarga el archivo School.mdf que acompaa 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 raz de la aplicacin, 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 (Asegrese de que est
bajo el proyecto, no bajo la solucin).
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
opcin degeneracin de base de datos por defecto. Haga clic en siguiente.

En el paso de Elegir la conexin de datos , deje los valores predeterminados y haga clic en siguiente. La
base de datos School est seleccionada por defecto y la configuracin de conexin 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.

Despus de que ha terminado creando el modelo, Visual Studio muestra una representacin grfica 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 ubicacin de los elementos individuales puede ser diferente de lo que ve en
esta ilustracin. Puede arrastrar los elementos alrededor para que coincida con la ilustracin 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 adicin de smbolos al final de cada asociacin que indican el tipo de
asociacin (relaciones de tablas se denominan asociaciones de entidad en el modelo de datos):
Una asociacin 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 slo un instructor.
Una asociacin 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 todava no hay ningn grado, el Grade propiedad es null. En otras palabras, un estudiante no
puede ser registrado en cualquier curso todava, puede estar matriculado en un curso o puede estar
matriculado en cursos mltiples. Cada grado en un curso de inscrito se aplica a slo un estudiante.
Una asociacin 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 tambin es cierto: una entidad de Course pueden o no pueden tener asociados
entidades Person . En otras palabras, un instructor puede ensear cursos mltiples, y un curso puede
ser impartido por instructores mltiples. (En esta base de datos, esta relacin se aplica nicamente a
los instructores; no lo vincula estudiantes a cursos. Los estudiantes estn ligados a cursos por la mesa
de StudentGrades.)
Otra diferencia entre el diagrama de base de datos y el modelo de datos es la seccin de Propiedades de
navegacin adicional para cada entidad. Una propiedad de navegacin de una entidad hace referencia a
entidades relacionadas. Por ejemplo, la propiedad de Courses en una entidad Person contiene una
coleccin de todas las entidades de Course que estn 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
Asociacin deCourseInstructor que se utiliza en la base de datos para vincular las
tablas Person y Course en una relacin de varios a varios. Las propiedades de navegacin 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 asociacin en el


modelo de datos.

Para los propsitos 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 diseador, 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
cdigo 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 asignacin entre ellos. Para verlo, haga clic derecho en un rea vaca en el diseador
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 diseador se puede ver cmo el Entity Framework se refiere a los
objetos de los dos modelos. Haga clic derecho en la entidad de Person y seleccione Asignacin 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 informacin 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
informacin.El diseador procesa la informacin en un formato grfico, pero tambin 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 diseador del modelo de datos y un editor de XML son slo dos
formas diferentes de abrir y trabajar con el mismo archivo, as que no puedes tener el diseador 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 aplicacin web de Contoso Universidad muestra demuestra cmo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener ms informacin 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 fcil trabajar con un
modelo de datos de Entity Framework. Crears 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 ms tarde para la visualizacin de cursos asociados).

Tenga en cuenta que en esta aplicacin no se agregar validacin de entrada a pginas que actualizacin la
base de datos, y algunos de la gestin de errores no ser tan robustos como seran necesarios en una
aplicacin de produccin. Eso mantiene el tutorial se centr en Entity Framework y mantiene poniendo
demasiado tiempo. Para obtener ms informacin acerca de cmo agregar estas caractersticas a su
aplicacin, consulte Validating User Input en pginas Web ASP.NET y Manejo de errores en las pginas
ASP.NET y aplicaciones.

Agregar y configurar el Control EntityDataSource


Empezars por configurar un control EntityDataSource para leer las entidades Person desde el
conjunto de entidades de People .
Asegrese de que tiene Visual Studio abiertos y que ests 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 estarn disponibles para el
diseador hasta que el proyecto se construye.
Crear una nueva pgina web utilizando la plantilla de formulario de la Web utilizando la pgina
maestra y asgnele el nombre Students.aspx.

Especificar Site.Master como pgina maestra. Todas las pginas creadas para estos tutoriales utilizar esta
pgina maestra.

En la vista cdigo fuente , aadir 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 pgina,
djalo 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 diseo , 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 Conexin de llamaday seleccione SchoolEntities como el valor DefaultContainerName . Haga clic
en siguiente.

Nota: Si tienes el siguiente cuadro de dilogo en este punto, tienes que construir el proyecto antes de
proceder.

En la etapa de Seleccin de datos configurar , seleccione personas como el valor


para EntitySetName. Enseleccionar, asegrese de que est seleccionada la casilla de

verificacin seleccionarll. Seleccione las opciones que permiten actualizar y eliminar. Cuando haya
terminado, haga clic en Finalizar.

Configuracin de las reglas de base de datos para


permitir la eliminacin
Usted podr crear una pgina 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 automticamente cuando se elimina una fila de Person . Para los
expedientes del estudiante en este tutorial, usted podr configurar la base de datos para eliminar
automticamente los datos relacionados. Porque los estudiantes pueden han relacionado las filas en la
tabla StudentGrade , tienes que configurar slo una de las tres relaciones.
Si ests usando el archivo School.mdf descargado del proyecto que acompaa este tutorial, puede omitir
esta seccin porque ya han hecho estos cambios en la configuracin. Si ha creado la base de datos
ejecutando un script, configurar la base de datos mediante la realizacin de los siguientes procedimientos.

En el Explorador de servidores, abrir el diagrama de base de datos que cre en la parte 1. La relacin
entre laPerson y StudentGrade (la lnea entre tablas) con el botn derecho y seleccione Propiedades.

En la ventana Propiedades , expanda INSERT y UPDATE especificacin 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 estn en la memoria en sintona 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 lnea de asociacin entre


la Person y StudentGradey a continuacin, 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 cmo sincronizar el modelo:

Para ciertos tipos de cambios (por ejemplo, agregar o actualizar las tablas, vistas o procedimientos
almacenados), haga clic en el diseador y seleccione Un modelo de actualizacin de base de
datos que tiene el diseador hace los cambios automticamente.
Regenerar el modelo de datos.

Realizar actualizaciones manuales como ste.

En este caso, usted podra haberse regenerado el modelo o actualiza las tablas afectadas por el cambio de
relacin, pero entonces tendras que hacer el cambio de nombre de campo
(de FirstName a FirstMidName).

Usando un Control GridView para leer y actualizar las


entidades
En esta seccin deber usar un control GridView para mostrar, actualizar o eliminar los estudiantes.
Abra o cambie a Students.aspx y cambie a la vista de diseo . 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 paginacin, Permiten clasificar, Habilitar ediciny 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 contratacin no es relevante para los estudiantes y a
poner ambas partes del nombre en un campo, tan slo 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 cdigo fuente . Los cambios restantes sern ms
fciles 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 despus 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 visualizacin, dos controles de Label muestran el nombre y apellido. En modo de edicin,
dos cuadros de texto se suministran para que puede cambiar el nombre y apellido. Como con los
controles Label en modo de visualizacin, utilice expresiones se Bind y Eval exactamente como lo hara
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 inscripcin. 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 imgenes
en pantalla que se muestra en este tutorial).
Observe que en cada uno de estos campos de la plantilla, el diseador utiliza una expresin Bind de
forma predeterminada, pero eso cambi a una expresin Eval en los elementos de la ItemTemplate . La
expresin Bindpone los datos disponibles en las propiedades del control GridView en caso de que usted
necesita acceder a los datos en el cdigo. En esta pgina no necesitas acceder a estos datos en el cdigo,
as que puede usar Eval, que es ms eficiente. Para obtener ms informacin, ver los datos de los
controles de datos.

Revisin 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
conexin 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 peticin. 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 navegacin estn cargadas con datos relacionados automticamente cuando
lo necesite. Carga perezoso se explica con ms detalle ms adelante en este tutorial.
Cualquier personalizacin que aplicados a la clase de contexto de objeto (en este caso, la
claseSchoolEntities ) estar disponible para los controles que utilizan el
control EntityDataSource .Personalizacin de la clase de contexto de objetos es un tema avanzado
que no est cubierto en esta serie de tutoriales. Para ms informacin, 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 caracterstica que era necesario en las versiones anteriores
de Entity Framework porque columnas de clave extranjeras no se exponen como propiedades de
entidad. La versin actual hace posible utilizar asociaciones claves extranjeras, que significa extranjeras

propiedades clave estn 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 ms
informacin, vea Objetos aplanar (EntityDataSource).
Ejecutar que la pgina y ver una lista de estudiantes y empleados (usted podr filtrar para estudiantes slo
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.

Tambin funciona el botn eliminar . Haga clic en borrar para una fila que tiene una fecha de inscripcin y
la fila desaparece. (Filas sin fecha inscripcin representan instructores y obtendr un error de integridad
referencial. En el siguiente tutorial se podr filtrar esta lista para incluir slo los estudiantes.)

Visualizacin de los datos de una propiedad de


navegacin

Ahora suponga que usted quiere saber cuntos cursos cada estudiante est matriculado en. Entity
Framework proporciona esa informacin en la propiedad de navegacin StudentGrades de la
entidad Person . Porque el diseo 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 navegacin Courses es slo para instructores).
Cuando se utiliza el atributo ContextTypeName del control EntityDataSource , Entity Framework
recupera automticamente informacin para una propiedad de navegacin 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 informacin adicional en cada tiempo. Si usted
necesita los datos de la propiedad de navegacin para cada entidad devuelta por el
control EntityDataSource , es ms 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 navegacin.
En Students.aspx, desea mostrar el nmero de cursos para todos los estudiantes, as carga ansiosa es la
mejor opcin.Si estaban mostrando todos los estudiantes, pero mostrando el nmero de cursos slo para
unos pocos de ellos (lo que requerira escribir algn cdigo adems el marcado), perezoso carga podra
ser una opcin mejor.
Abra o cambie a Students.aspx, cambie a la vista diseo , seleccione StudentsEntityDataSourcey en la
ventanaPropiedades , establezca la propiedad de incluir a StudentGrades. (Si quieres obtener mltiples
propiedades de navegacin, puede especificar sus nombres separados por comas, por
ejemplo, StudentGrades, cursos.)

Cambie a la vista de la fuente . En el StudentsGridView de control, despus 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 expresin de Eval , puede hacer referencia a la propiedad de navegacin StudentGrades. Debido a
esta propiedad contiene una coleccin, tiene una propiedad Count que puede utilizar para mostrar el
nmero de cursos en los que el estudiante est matriculado. En un posterior tutorial vers cmo mostrar
los datos de las propiedades de navegacin 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 navegacin).
Ejecute la pgina y ahora ver cuntos cursos cada estudiante est matriculado en.

Usando un Control DetailsView para introducir entidades


El siguiente paso es crear una pgina que tenga un control DetailsView que le permitir agregar nuevos
estudiantes. Cierre el navegador y luego crear una nueva pgina web usando la Pgina
principal Site.Master .Nombre de la pgina StudentsAdd.aspxy luego cambiar a la vista de cdigo 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 insercin. Como con el control GridView , los campos enlazados del
control DetailsView se identifican exactamente como lo sera 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 insercin de filas, as ha definido el modo por
defecto para Insert.
Ejecute la pgina y aadir un nuevo estudiante.

No pasar nada despus de insertar un nuevo alumno, pero si ahora ejecutar Students.aspx, vers la nueva
informacin del estudiante.

Mostrar datos en una lista desplegable


En los siguientes pasos tendrs un control DropDownList a una entidad creada utilizando un
controlEntityDataSource databind. En esta parte del tutorial, no hars 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 pgina web llamada Courses.aspx. En la vista cdigo fuente , aadir un ttulo 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 diseo , agregue un control EntityDataSource a la pgina como lo hiciste antes, excepto que
esta vez el nombre DepartmentsEntityDataSource. Seleccione departamentos como el valor
de EntitySetName y seleccione slo las propiedades DepartmentID y nombre .

Desde la ficha estndar de la caja de herramientas, arrastre un control DropDownList a la pgina, el


nombreDepartmentsDropDownList, haga clic en la etiqueta inteligente y seleccione Elegir origen de
datos para iniciar elAsistente de configuracin 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 mtodo 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 cdigo 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 despus 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 despus de hacer el
cambio, el diseador no le proporcionar una opcin Actualizar esquema en el control enlazado a datos.
Ejecute la pgina y se puede seleccionar un departamento de la lista desplegable.

Esto completa la introduccin 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 excepcin es cuando
quieres acceder a las propiedades de navegacin. En el siguiente tutorial que vers que la sintaxis utilice
con control EntityDataSource tambin 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 aplicacin web de Contoso Universidad muestra demuestra cmo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener ms informacin 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 pgina de Students.aspx para filtrar para los estudiantes, ordenar por nombre y en
nombre de la bsqueda. Tambin podr cambiar la pgina de Courses.aspx para visualizar cursos para el
Departamento de seleccin y bsqueda de cursos por nombre. Por ltimo, aadiremos estadsticas de
estudiante a la pginaAbout.aspx .

Mediante la EntityDataSource "Donde" propiedad para


filtrar datos
Abra la pgina Students.aspx que cre en el tutorial anterior. Como actualmente configurado, el
control GridView en la pgina muestra todos los nombres del conjunto de entidades de People . Sin
embargo, desea mostrar slo los estudiantes, que usted puede encontrar mediante la seleccin de
entidades de Person que tienen fechas de inscripcin no es null.
Cambie a la vista diseo 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 expresin 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 pgina. La lista de estudiantes ahora contiene slo los estudiantes. (No quedan filas aparece
donde no hay inscripcin fecha.)

Mediante la propiedad "OrderBy" EntityDataSource a los


datos de pedidos
Tambin quiere que sea en nombre de orden cuando primero se muestra esta lista. Con la
pgina Students.aspxsigue abierta en la vista diseo y con el EntityDataSource control an seleccionada,
en el ventana Propiedadesdel conjunto la propiedad OrderBy en it.LastName.

Ejecutar la pgina. La lista de los estudiantes est en orden por apellido.

Utilizando un parmetro de Control para establecer la


propiedad "Donde"
Como con otros controles de origen de datos, puede pasar a la propiedad Where los valores de
parmetro. En la pgina Courses.aspx que ha creado en la segunda parte del tutorial, puede utilizar este
mtodo para mostrar cursos que estn asociadas con el departamento que el usuario selecciona de la lista
desplegable.
Abra Courses.aspx y cambie a la vista diseo . Agregar un segundo control EntityDataSource a la pgina
y asgnele el nombre CoursesEntityDataSource. Conctelo 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. (Asegrese de que el control CoursesEntityDataSource an est seleccionado antes de usar
la ventana de Propiedades ).

Aparece el cuadro de dilogo Editor de expresiones . En este cuadro de dilogo, seleccione generar
automticamente el donde expresin basada en los parmetros proporcionadosy haga clic en Aadir
parmetro. Nombre del parmetro DepartmentID, seleccione Control como el valor del parmetro
origen y seleccione DepartmentsDropDownList como el valor ControlID .

Haga clic en Mostrar propiedades avanzadasy en la ventana de Propiedades del cuadro de


dilogo 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 pgina y asgnele el
nombre CoursesGridView.Conctelo 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 automticamente. Para ello, seleccione la lista desplegable y en la
ventana Propiedades , establezca la propiedad AutoPostBack en True.

Ahora que ha terminado con el diseador, 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 pgina 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 estadsticas estudiantil en su pgina
sobre. Especficamente, quiere mostrar un desglose de los nmeros de estudiantes antes de la fecha que
se matriculado.
Abra About.aspxy en la vista cdigo fuente , reemplace el contenido existente del
control BodyContent con "Estudiante cuerpo estadsticas" entre etiquetas h2 :
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>Student Body Statistics</h2>
</asp:Content>
Despus de la partida, agregue un control EntityDataSource y asgnele 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 inscripcin, establezca la
propiedad GroupBy it.EnrollmentDate.
Para seleccionar la fecha de inscripcin y el nmero de estudiantes, establezca la
propiedad Select ait.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents.
Para ordenar los resultados de la fecha de inscripcin, establezca la
propiedad OrderBy enit.EnrollmentDate.
En la vista cdigo 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 excepcin 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 pgina para ver una lista mostrando el nmero de alumnos por fecha de inscripcin.

Utilizando el Control QueryExtender para filtrar y ordenar


El control QueryExtender proporciona una manera de especificar filtrado y clasificacin en el marcado. La
sintaxis es independiente del sistema de gestin de bases de datos (DBMS) ests usando. Tambin es
generalmente independiente de Entity Framework, con la excepcin de que utilizas para las propiedades
de navegacin 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 navegacin.
(Si usted prefiere utilizar cdigo en lugar de marcado para extender las consultas que se generan
automticamente por el control EntityDataSource , puedes hacerlo controlando el
evento QueryCreated . Esto es cmo el controlQueryExtender extiende las consultas de
control EntityDataSource tambin).
Abra la pgina Courses.aspx y por debajo de la marca que aadiste anteriormente, introduzca el siguiente
marcado para crear un encabezado, un cuadro de texto para entrar en las cadenas de bsqueda, un botn
de bsqueda 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
fornea DepartmentID . Si se consulta la base de datos directamente, para obtener el nombre de
departamento junto con datos del curso, tendras 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 navegacin
del Departmentde la entidad de Course . (De forma predeterminada, la clase de SchoolEntities que fue
generada por el diseador 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, establecindolo mejora el rendimiento de la pgina, porque de lo
contrario hara 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 .)
Despus 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 ttulos coincida con el valor
especificado en el cuadro de texto. Solamente como muchos personajes que figuran en el cuadro de texto
se compararn, porque el SearchType propiedad especifica StartsWith.
El elemento OrderByExpression especifica que el conjunto de resultados se ordenarn por ttulo del
curso en nombre del departamento. Observe cmo se especifica el nombre del
Departamento: Department.Name. Porque la asociacin entre la entidad de Course y la
entidad Department es uno-a-uno, el Department propiedad de navegacin contiene una entidad
del Department . (Si esto fuera una relacin uno a muchos, la propiedad contendra una coleccin). 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 expresin de
enlace de datos especifica Department.Name, al igual que viste en el control QueryExtender .
Ejecutar la pgina. La pantalla inicial muestra una lista de todos los cursos en orden por departamento y
luego por el ttulo del curso.

Entrar en una "m" y haga clic en Buscar para ver todos los cursos cuyos ttulos comienzan con "m" (la
bsqueda 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
bsquedaEndsWith mediante un operador Like en propiedad del control EntityDataSource Where . En
esta parte del tutorial, vers cmo utilizar el operador Like para la bsqueda de un estudiante por
nombre.
Abra Students.aspx en vista de cdigo fuente . Despus 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 expresin Where define una bsqueda 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 pgina. Inicialmente vers todos los estudiantes porque el valor predeterminado para el
parmetroStudentName 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 aplicacin web de Contoso Universidad muestra demuestra cmo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener ms informacin 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, clasificacin y datos del grupo. En
este tutorial usted podr visualizar y actualizar datos relacionados.
Crears la pgina instructores que muestra una lista de instructores. Cuando se selecciona un instructor,
vers 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
contratacin y asignacin de la oficina. La asignacin de la oficina es un conjunto de entidad separada que
se puede acceder mediante una propiedad de navegacin.
Se pueden enlazar datos maestros con datos de detalle en el marcado o en cdigo. En esta parte del
tutorial, deber usar ambos mtodos.

Visualizacin y actualizacin de las entidades vinculadas


en un Control GridView
Crear una nueva pgina web denominada Instructors.aspx que utiliza la Pgina 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 ms 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 usars 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 seleccin de filas, destaca la fila seleccionada con un color de fondo gris
claro y especifica los controladores (que crears ms adelante) para los
eventos SelectedIndexChanged y Updating .Tambin especifica PersonID para la
propiedad DataKeyNames , as el valor de la clave de la fila seleccionada puede pasarse a otro control que
aadiremos ms tarde.
La ltima columna contiene la asignacin, del instructor oficina, que se almacena en una propiedad de
navegacin 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 navegacin para actualizarlos. Usted podr actualizar la
asignacin de la oficina en el cdigo. 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 slo cuando cdigo hace visible en respuesta a un error.
Abra el archivo Instructors.aspx.cs y agregue la siguiente instruccin using :
using ContosoUniversity.DAL;
Agregar un campo de clase privada inmediatamente despus de la declaracin de clase parcial nombre
para mantener una referencia a la casilla de texto asignacin.
private TextBox instructorOfficeTextBox;
Agregue un trozo para el controlador del evento SelectedIndexChanged que podrs agregar cdigo
para ms tarde. Tambin agregar un controlador para el evento Init del Oficina
asignacin TextBox control as que usted puede almacenar una referencia al control TextBox . Utilizars
esta referencia para obtener el valor introducido para actualizar la entidad asociada a la propiedad de
navegacin 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 cdigo se ejecuta cuando el usuario hace clic en Actualizar en la fila de un GridView . El cdigo
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 discusin del evento.
El cdigo 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 vaco y existe una entidad OfficeAssignment , elimina la entidad.
Despus de esto, salva los cambios a la base de datos. Si se produce una excepcin, muestra un mensaje
de error.
Ejecutar la pgina.

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

Cambiar cualquiera de estos valores, incluyendo la Asignacin de la oficina. Haga clic en Actualizar y
vers los cambios reflejados en la lista.

Mostrar entidades relacionadas en un Control separado


Cada instructor puede ensear uno o ms cursos, as que aadiremos 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 direccin 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 parmetro 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 slo si una de las
entidades asociadas de Personcontiene el valor seleccionado PersonID .
Para crear el control GridView ., agregue el marcado siguiente inmediatamente despus 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 ningn instructor, se incluye un
elementoEmptyDataTemplate .
Ejecutar la pgina.

Seleccione un instructor que tiene uno o ms cursos asignados, y el curso o cursos que aparecen en la
lista. (Nota: Aunque el esquema de base de datos permite mltiples cursos, en los datos de prueba
suministrados con la base de datos instructor en realidad no tiene ms de un curso. Usted puede agregar
cursos a la base de datos usando la ventana del Explorador de servidores o en la
pgina CoursesAdd.aspx , que aadiremos en un tutorial ms adelante.)

El control CoursesGridView muestra slo 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 despus del cierre </div> etiqueta
(Asegrese de colocar este marcado despus 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 ms tarde para la visualizacin de calificaciones de los estudiantes, que es
otro nivel ms bajo en la jerarqua.
En Instructors.aspx.cs, cree el siguiente trozo para el
mtodo CourseDetailsEntityDataSource_Selected .(Podrs llenar este trozo ms adelante en el
tutorial, por ahora, lo necesitas para que la pgina se compila y ejecuta).
protected void CourseDetailsEntityDataSource_Selected(object sender,
EntityDataSourceSelectedEventArgs e)
{
}
Ejecutar la pgina.

Inicialmente hay no hay detalles del curso porque no se ha seleccionado ningn curso. Seleccione un
instructor que tiene un curso asignado y a continuacin, 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 despus 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. Ningn origen de datos especificado porque tendrs databind del control en el
cdigo. El elementoEmptyDataTemplate proporciona un mensaje que se mostrar cuando no se ha
seleccionado ningn curso en ese caso, no hay ningn 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 disposicin de la propiedad de
navegacin de la Person de la entidad StudentGrade Entity Framework.
En Instructors.aspx.cs, reemplace el mtodo de CourseDetailsEntityDataSource_Selected de golpear
con el siguiente cdigo:
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
coleccin, que tendr cero elementos si no se selecciona o un artculo si se selecciona una entidad
de Course . Si se selecciona una entidad de Course , el cdigo utiliza el First mtodo para convertir la
coleccin en un objeto nico. A continuacin obtiene entidades StudentGrade de la propiedad de
navegacin, convierte a una coleccin y enlaza el controlGradesListView a la coleccin.
Esto es suficiente Mostrar grados, pero quiere asegurarse de que el mensaje en la plantilla de datos vaca
se muestra la primera vez que aparece la pgina y cuando no se selecciona un curso. Para ello, cree el
siguiente mtodo, que se podr llamar desde dos lugares:
private void ClearStudentGradesDataSource()
{
var emptyStudentGradesList = new List<StudentGrade>();
GradesListView.DataSource = emptyStudentGradesList;
GradesListView.DataBind();
}
Llame a este nuevo mtodo del mtodo Page_Load para mostrar la hora de la primera plantilla de datos
vaca que se muestra la pgina. Y llamarlo desde el

mtodo 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 todava. Aqu estn 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 pgina.

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 cmo agregar las relaciones entre las entidades existentes, cmo quitar las relaciones y cmo
agregar una nueva entidad que tiene una relacin 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 aplicacin web de Contoso Universidad muestra demuestra cmo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener ms informacin 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 jerarqua y haba editado los datos en las propiedades de
navegacin. En este tutorial se continuar trabajando con datos relacionados aadiendo y borrando las
relaciones y mediante la adicin de una nueva entidad que tiene una relacin con una entidad existente.
Crears una pgina que aade 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 relacin entre l y un
departamento existente.

Tambin crears una pgina que trabaja con una relacin muchos-a-muchos mediante la asignacin de un
instructor de un curso (aadiendo una relacin entre dos entidades que selecciona) o quitar un instructor
de un curso (eliminacin de una relacin entre dos entidades que se selecciona). En la base de datos,
agregando una relacin entre un instructor y un curso en una nueva fila se agrega a la tabla de Asociacin
de CourseInstructor ; quitar una relacin consiste en eliminar una fila de la tabla de Asociacin
de CourseInstructor . Sin embargo, haces esto en Entity Framework estableciendo las propiedades de
navegacin, sin referirse explcitamente a la tablaCourseInstructor .

Adicin de una entidad con una relacin con una entidad


existente
Crear una nueva pgina web denominada CoursesAdd.aspx que utiliza la Pgina 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 . Utilizars el controlador para actualizar
el Department propiedad de navegacin cuando se crea una nueva entidad de Course .
El marcado tambin 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 identificacin. En cambio, es un
nmero del curso que debe especificarse manualmente cuando se crea el curso.
Utilice un campo de plantilla para la propiedad de navegacin Department porque las propiedades de
navegacin 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 navegacin 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 cdigo que actualiza la clave externa DepartmentID .
En CoursesAdd.aspx.cs justo despus de la declaracin 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
rcord. El cdigo 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 navegacin de Courses de la
entidad asociada del Department . El Departamento tambin agrega a la propiedad de navegacin
del Department de la entidad deCourse .
Ejecutar la pgina.

Introduzca un ID, un ttulo, un nmero de crditos y seleccione un departamento, luego haga clic
en Insertar.
Ejecutar la pgina Courses.aspx y seleccione el mismo departamento para ver el nuevo curso.

Trabajar con relaciones muchos-a-muchos


La relacin entre el conjunto de entidades de Courses y el conjunto de entidades de People es una
relacin de varios a varios. Una entidad de Course tiene una propiedad de navegacin
llamada People que puede contener cero, uno o ms Person entidades (representando a instructores
asignados para impartir el curso). Y una entidadPerson tiene una propiedad de navegacin
denominada Courses que puede contener cero, uno o ms Courseentidades (representando el instructor
asignado para ensear cursos). Un instructor puede ensear cursos mltiples, y un curso puede ser
impartido por instructores mltiples. En esta seccin del tutorial, podr aadir y quitar las relaciones entre
las entidades Person y Course mediante la actualizacin de las propiedades de navegacin de las
entidades relacionadas.
Crear una nueva pgina web denominada InstructorsCourses.aspx que utiliza la Pgina
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 . Utilizars este controlador a databind las dos listas que muestran cursos.
El marcado tambin 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 popularn con los
cursos que actualmente no estn asignados al instructor seleccionado.
Un control de Button para iniciar la tarea.
Un control Label para mostrar un mensaje de error si falla la asignacin.
Finalmente, el marcado tambin crea un grupo de controles para quitar un curso de instructor
seleccionado.

En InstructorsCourses.aspx.cs, agregue un uso declaracin:


using ContosoUniversity.DAL;
Agregue un mtodo 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 cdigo obtiene todos los cursos desde el conjunto de entidades Courses y recibe los cursos de la
propiedad de navegacin de Courses de la entidad de Person para el instructor seleccionado. A
continuacin, determina qu cursos son asignados a ese instructor y rellena las listas desplegables en
consecuencia.
Agregar un controlador para el evento Click del botn 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 cdigo obtiene la entidad Person para el instructor seleccionado, obtiene la entidad del Course del
curso seleccionado y agrega la propiedad de navegacin 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 botn 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 cdigo 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 navegacin. Luego guarda los cambios a la base de datos y vuelve a llenar las
listas desplegables para que los resultados pueden verse inmediatamente.
Agregue cdigo al mtodo Page_Load que asegura que los mensajes de error no son visibles cuando no
hay ningn 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 pgina.

Seleccione un instructor. La lista desplegable asignar un curso muestra los cursos que no ensea el
instructor, y la lista desplegable quitar un curso de los cursos que el instructor ya est asignado a. En la
seccin 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 seccin de quitar un curso y haga clic
en quitar. El curso se mueve a la lista desplegable asignar un curso .
Ahora hemos visto algunos ms maneras de trabajar con datos relacionados. En el siguiente tutorial,
aprender cmo usar herencia en el modelo de datos para mejorar la capacidad de mantenimiento de la
aplicacin

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 aplicacin web de Contoso Universidad muestra demuestra cmo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener ms informacin sobre la
serie de tutoriales, ver el primer tutorial de la serie

Implementacin de herencia de tabla por jerarqua


En el tutorial anterior trabajaste con datos relacionados aadiendo y borrando las relaciones y mediante la
adicin de una nueva entidad que tuvo una relacin con una entidad existente. Este tutorial le mostrar
cmo implementar la herencia en el modelo de datos.
En la programacin orientada a objetos, puede utilizar herencia para hacerlo ms fcil 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 ningn nuevas pginas web. En cambio, podr agregar
derivados de entidades en el modelo de datos y modificar las pginas existentes para utilizar las nuevas
entidades.

Tabla por jerarqua frente a la herencia de tabla por tipo


Una base de datos puede almacenar informacin acerca de los objetos relacionados en una tabla o varias
tablas. Por ejemplo, en la School base de datos, la tabla Person incluye informacin sobre los estudiantes
y profesores en una sola tabla. Algunas de las columnas se aplican slo a los instructores (HireDate), slo
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 patrn de generar una estructura de herencia de entidad de una tabla de base de
datos se denomina herencia de tabla por jerarqua (TPH).
Para los cursos, la School base de datos utiliza un patrn diferente. Cursos en lnea y en el sitio se
almacenan en tablas separadas, cada una de ellas tiene una clave externa que apunta a la
tabla Course . Informacin comn 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 patrn de generar una
estructura de herencia de entidad de mesas separadas para cada tipo, con cada mesa separada
refirindose 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 cmo implementar la herencia de TPH. Hars 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 condicin que especifica cmo
determinar si una Person fila representa ese tipo derivado.

Adicin de Instructor y estudiante entidades

Abra el archivo SchoolModel.edmx , haga clic derecho en un rea desocupado en el diseador,


seleccione Agregary seleccionar entidad.

En el cuadro de dilogo Agregar


opcin Tipo

Base enPerson.

entidad nombre la entidad Instructor y establezca su

Haga clic en Aceptar. El diseador crea una entidad Instructor que deriva de la entidad Person . La
nueva entidad todava no tiene ninguna propiedad.

Repita el procedimiento para crear una entidad Student que deriva tambin de la Person.
Slo 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 contratacin 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. Asegrese de que tambin configurar Nullable en False para la
propiedad EnrollmentDate .

Ahora que una entidad Person tiene slo las propiedades que son comunes a las
entidades Instructor y Student(aparte de las propiedades de navegacin, que no te vas), la entidad
slo 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.

Cartografa de Instructor y estudiante entidades a la tabla


persona
Ahora tienes que decirle el Entity Framework Cmo 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 asignacin, haga clic en agregar una tabla o vista y seleccione persona.

Haga clic en agregar

una condiciny 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
diseador.

Con el Instructor y estudiante entidades


Al crear las pginas 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
slo Student o Instructor deben ser seleccionados. Entity Framework sabe distinguir estudiantes e
instructores en la entidad Person establecen, puede quitar la configuracinWhere propiedad introducida
manualmente para hacer eso.
En el diseador 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 clusula 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, harn que los cambios requeridos por el
cambio marcado en su lugar.
Abra la pgina Students.aspx . En el control de StudentsEntityDataSource , quitar el atributo Where y
aadir 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 quera recuperar los tipos de
entidad Instructor y Student , no se establecera este atributo. (Usted tiene la opcin de recuperar
varios tipos de entidad con un solo control EntityDataSourcesolamente si est usando el control de
acceso a datos de slo lectura. Si ests usando un controlEntityDataSource para insertar, actualizar o
eliminar entidades, y el conjunto de entidades que es obligado puede contener varios tipos, slo 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 pgina para verificar que todava funciona como lo haca antes.

Actualizacin de las pginas 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 aplicacin Contoso Universidad de


varias maneras. Has movido lgica seleccin y validacin 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 cdigo de la aplicacin 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 podra decidir que los estudiantes podran ser contratados como auxiliares docentes y por
lo tanto tendra una fecha de contratacin.Entonces usted podra agregar una nueva propiedad para
diferenciar a los estudiantes de instructores y actualizar el modelo de datos. Ningn cdigo en la
aplicacin web tendra que modificar excepto donde queras mostrar una fecha de contratacin para los
estudiantes. Otro beneficio de agregar entidades Instructor y Student es que el cdigo es ms
fcilmente comprensible que cuando se refiere a Person objetos que eran realmente estudiantes o
profesores.
Ahora has visto una forma de implementar un patrn de herencia en Entity Framework. En el siguiente
tutorial, aprender cmo utilizar procedimientos almacenados con el fin de tener ms control sobre cmo
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 aplicacin web de Contoso Universidad muestra demuestra cmo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener ms informacin sobre la
serie de tutoriales, ver el primer tutorial de la serie

Utilizando procedimientos almacenados


En el tutorial anterior haba implementado un patrn de herencia de tabla por jerarqua. Este tutorial le
mostrar cmo usar los procedimientos almacenados para ganar ms 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 recuperacin de conjuntos de
entidades.
Utilizando procedimientos almacenados es un requisito comn 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 travs de procedimientos almacenados por razones de seguridad. En otros casos quiz quieras
construir la lgica 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 deberas 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
quin 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 crears las pginas nuevas. En cambio, usted podr cambiar la forma
Entity Framework tiene acceso a la base de datos para algunas de las pginas ya ha creado.
En este tutorial crears procedimientos almacenados en la base de datos para insertar las
entidades Instructor yStudent . Podr aadirlos 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. Tambin
crears un procedimiento almacenado que puede utilizar para recuperar el Course las entidades.

Creacin de procedimientos almacenados en la base de


datos

(Si ests usando el archivo School.mdf del proyecto disponible para su descarga con este tutorial, puede
omitir esta seccin porque ya existen los procedimientos almacenados.)
En el Explorador

de servidores, expanda School.mdf, Procedimientos almacenadoscon el


botn 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

automticamente el valor de ID, y el procedimiento almacenado acepta parmetros 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 versin 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 tambin. (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 podrs asignar las tres funciones, insert, update y delete--para cada tipo de entidad. Entity
Framework versin 4 le permite asignar uno o dos de estas funciones a los procedimientos almacenados
sin asignacin de los dems, con una excepcin: Si asigna la funcin de actualizacin, pero no la funcin
Borrar, Entity Framework producir una excepcin cuando se intenta eliminar una entidad. En Entity

Framework versin 3.5, no ha tenido tanta flexibilidad en la asignacin de procedimientos almacenados: Si


usted asigna una funcin 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 estn disponibles para Entity Framework. Abrir SchoolModel.edmx, haga clic
derecho en la superficie de diseo y seleccionar Un

modelo de actualizacin de base de


datos. En la opcin de Agregar del cuadro de dilogo Elegir su base de datos de objetos ,
ampliar Los procedimientos almacenados, seleccionar los procedimientos almacenados recin
creados y el procedimiento de DeletePerson almacenado y haga clic enFinalizar.

Mapeo de los procedimientos almacenados


En el diseador del modelo de datos, haga clic derecho en la entidad Student y seleccione Asignacin

de procedimiento almacenado.

Aparece la ventana de Detalles de asignacin , en el que puede especificar procedimientos


almacenados que debe usar Entity Framework para insertar, actualizar y eliminar entidades de este tipo.

Ajuste la funcin Insertar InsertStudent. La ventana muestra una lista de parmetros del
procedimiento almacenado, cada uno de los cuales se debe asignar a la propiedad de una entidad. Dos de
stos se asignan automticamente 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 Asignacin de datos , asignar la funcin de Update al


procedimiento UpdateStudentalmacenado (Asegrese de que especifica FirstMidName como el valor del
parmetro para el FirstName, como para la Insert procedimiento almacenado) y la funcin
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 diseador del modelo de datos, haga clic derecho en la superficie de diseo y
seleccione Explorador

de modelos. Abra el nodoSchoolModel.Store y a continuacin, abra el


nodo Stored Procedures . A continuacin haga clic derecho en el
procedimiento GetCourses almacenado y seleccione Agregar funcin de importacin.

En el cuadro de dilogo Agregar

funcin de importacin bajo devuelve una coleccin

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
automticamente despus de haber agregado al modelo de datos y les asignan a las entidades
apropiadas. Ya puedes ejecutar la pgina StudentsAdd.aspx , y cada vez que se crea una nueva estudiante,
Entity Framework utilizar el procedimiento InsertStudent almacenado para aadir la nueva fila a la
tabla Student .

Ejecute la pgina Students.aspx y el nuevo alumno aparece en la lista.

Cambie el nombre para comprobar que funciona la funcin de actualizacin y a continuacin, elimine el
estudiante para comprobar que funciona la funcin de eliminar.

Utilizando procedimientos almacenados seleccionados


Entity Framework no se ejecuta automticamente los procedimientos almacenados como GetCourses, y
no los puede utilizar con el control EntityDataSource . Para usarlos, llamarlos desde el cdigo.
Abra el archivo InstructorsCourses.aspx.cs . El mtodo PopulateDropDownLists utiliza una consulta LINQ
a entidades para recuperar todas las entidades de curso para que pueda recorrer la lista y determinar
cules se asigna un instructor y cules estn sin asignar:
var allCourses = (from c in context.Courses
select c).ToList();
Sustituir esto con el siguiente cdigo:

var allCourses = context.GetCourses();


La pgina utiliza el procedimiento GetCourses almacenados para recuperar la lista de todos los
cursos. Ejecute la pgina para verificar que funciona como lo haca antes.
(Propiedades de navegacin de entidades obtenidas por un procedimiento almacenado pueden no se
rellena automticamente con los datos relacionados a esas entidades, dependiendo de la configuracin
por defecto deObjectContext . Para ms informacin, consulte Cargar objetos relacionados en MSDN
Library.)
En el siguiente tutorial, aprender a utilizar la funcionalidad de datos dinmicos para hacerlo ms fcil de
programar y probar datos formato y validacin de las reglas. En lugar de especificar en cada pgina 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 automticamente en cada pgina.

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 aplicacin web de Contoso Universidad muestra demuestra cmo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener ms informacin sobre la
serie de tutoriales, ver el primer tutorial de la serie

Usando la funcionalidad de datos dinmicos para validar


los datos y el formato
En el tutorial anterior haba implementado procedimientos almacenados. Este tutorial le mostrar cmo la
funcionalidad de datos dinmicos puede proporcionar los siguientes beneficios:
Campos se formatean automticamente para la exhibicin en su tipo de datos base.

Campos se validan automticamente basndose en su tipo de datos.

Puede agregar metadatos para el modelo de datos para personalizar el comportamiento de formato
y validacin. Cuando haces esto, usted puede agregar las reglas de formato y validacin en un lugar y
aplican automticamente en todas partes usted acceder a los campos utilizando los controles de
datos dinmicos.
Para ver cmo funciona esto, va a cambiar los controles que se utilizan para mostrar y editar campos en la
pgina deStudents.aspx existente, y usted podr agregar metadatos formateo y validacin a los campos de
nombre y fecha del tipo de entidad Student .

Mediante DynamicField y control DynamicControl


Abra la pgina Students.aspx y en el control de StudentsGridView reemplazar los nombre y la Fecha

de inscripcin 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 inscripcin. No
hay cadenas de formato se especifican.
Agregue un control ValidationSummary despus 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

inscripcin 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 instruccin using :
using ContosoUniversity.DAL;
Agregar un controlador para el evento Init de la pgina:
protected void Page_Init(object sender, EventArgs e)
{
StudentsGridView.EnableDynamicData(typeof(Student));
SearchGridView.EnableDynamicData(typeof(Student));
}
Este cdigo especifica que los datos dinmicos proporcionar formateo y validacin 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 pgina, normalmente significa que has olvidado de llamar al
mtodo 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 pgina.

En la columna Fecha de inscripcin , el tiempo se muestra junto con la fecha porque el tipo de
propiedad esDateTime. Ms tarde lo podr arreglar.
Por ahora, tenga en cuenta que los datos dinmicos automticamente proporciona validacin de datos
bsicos. Por ejemplo, haga clic en Editar, claro que el campo fecha, haga clic en Actualizary ver que
datos dinmicos automticamente hace esto un campo obligatorio porque el valor no es anulable en el
modelo de datos. La pgina muestra un asterisco despus del campo y un mensaje de error en el
control ValidationSummary :

Se podra omitir el control ValidationSummary , porque tambin puede mantener el puntero del mouse
sobre el asterisco para ver el mensaje de error:

Datos dinmicos tambin validar que los datos introducidos en el campo


una fecha vlida:

Fecha de inscripcin estn

Como puedes ver, este es un mensaje de error genrico. En la siguiente seccin, ver cmo personalizar
los mensajes as como validacin y reglas de formato.

Agregar metadatos al modelo de datos


Normalmente, quieres personalizar la funcionalidad proporcionada por datos dinmicos. Por ejemplo,
cambie el modo de visualizacin de datos y el contenido de los mensajes de error. Es tpicamente tambin
personalizar las reglas de validacin de datos para proporcionar ms funcionalidad que lo proporciona
datos dinmicos automticamente basndose 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 cdigo de plantilla
en l con el siguiente cdigo.
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 cdigo 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 ms "Metadatos" es una prctica comn.
Los atributos aplicados a las propiedades de la clase de metadatos especifican formato, los mensajes de
error, reglas y validacin. 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 pgina Students.aspx , y vers 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 pgina muestra el texto del mensaje de error especificado.

Intente introducir nombres que son ms de 25 caracteres, haga clic en


texto del mensaje de error especificado.

Updatey la pgina muestra el

Ahora que ya has engaado estas reglas de formato y validacin en los metadatos del modelo de datos,
las reglas se aplicarn automticamente en cada pgina que muestra o permite hacer cambios a estos
campos, mientras utilizasDynamicControl o DynamicField controla. Esto reduce la cantidad de cdigo
redundante tienes que escribir, que hace programacin y pruebas ms fcil, y se asegura de que el
formato de datos y validacin son consistentes a travs de una aplicacin.

Ms informacin

Esto concluye esta serie de tutoriales sobre cmo empezar con Entity Framework. Para ms recursos para
ayudarle a aprender cmo 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

Вам также может понравиться