Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Getting Started With Entidad Framework 4 PDF
Getting Started With Entidad Framework 4 PDF
0
Database primero y ASP.NET 4 formas de
Web
Por Tom Dykstra|03 de diciembre de 2010
Imprimir
La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. La aplicación de ejemplo es un sitio web
para una ficticia Contoso Universidad. Incluye funcionalidades tales como admisión estudiante, curso
creación y asignaciones de instructor.
El tutorial muestra ejemplos en C#. La muestra descargable contiene código en C# y Visual Basic.
Base de datos primero
Hay tres maneras que usted puede trabajar con datos en Entity Framework: Primera base de datos, Primer
modeloy Primer código. Este tutorial es para el primera base de datos. Para obtener más información sobre
las diferencias entre estos flujos de trabajo y orientación sobre cómo elegir el mejor uno de su escenario,
verEntidad marco desarrollo de flujos de trabajo.
Formularios Web Forms
Esta serie de tutoriales utiliza el modelo de los formularios Web ASP.NET y asume que ya sabes cómo
trabajar con formularios Web ASP.NET en Visual Studio. Si no, ves Empezando con ASP.NET 4.5
formularios Web Forms.Si usted prefiere trabajar con el framework ASP.NET MVC, vea Introducción a
Entity Framework utilizando ASP.NET MVC.
Versiones de software
Se muestra
en el tutorial También trabaja con
Windows 7 Windows 8
Visual Studio El tutorial no ha sido probado con versiones anteriores de Visual Studio. Hay muchas
2010 diferencias en las selecciones de menú, cuadros de diálogo y plantillas.
4. NET 4.5. net es compatible con .NET 4, pero el tutorial no ha sido probado con .NET 4.5.
A partir de entidad marco 5, EF usa por defecto la DbContext API que fue introducido
con EF 4.1. El control EntityDataSource fue diseñado para
Entity utilizar ObjectContext API.Para obtener más información sobre cómo utilizar el control
Framework 4 EntityDataSource con laDbContext API, vea esta entrada de blog.
Preguntas
Si tienes preguntas que no están directamente relacionadas con el tutorial, se les pueden enviar al Foro de
ASP.NET Entity Framework, Entity Framework y LINQ to Foro de entidadeso StackOverflow.com.
Resumen
La aplicación que va a construir estos tutoriales es un sitio web simple Universidad.
Los usuarios pueden ver y actualizar información de instructor, curso y estudiante. Abajo se muestran
algunas de las pantallas que crearás.
Creación de la aplicación Web
Para empezar el tutorial, Abra Visual Studio y crear un nuevo proyecto de aplicación Web ASP.NET
utilizando la plantilla de aplicación Web ASP.NET :
Esta plantilla crea un proyecto de aplicación web que ya incluye una hoja de estilos y páginas maestras:
Abre el archivo Site.Master y cambiar "Mi aplicación ASP.NET" a "Universidad Contoso".
<h1>
Contoso University
</h1>
Encontrar el menú de control llamado NavigationMenu y reemplazarlo por el siguiente marcado, que
añade elementos de menú para las páginas que va a crear.
<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu"
EnableViewState="false"
IncludeStyleBlock="false" Orientation="Horizontal">
<Items>
<asp:MenuItem NavigateUrl="~/Default.aspx" Text="Home" />
<asp:MenuItem NavigateUrl="~/About.aspx" Text="About" />
<asp:MenuItem NavigateUrl="~/Students.aspx" Text="Students">
<asp:MenuItem NavigateUrl="~/StudentsAdd.aspx" Text="Add
Students" />
</asp:MenuItem>
<asp:MenuItem NavigateUrl="~/Courses.aspx" Text="Courses">
<asp:MenuItem NavigateUrl="~/CoursesAdd.aspx" Text="Add
Courses" />
</asp:MenuItem>
<asp:MenuItem NavigateUrl="~/Instructors.aspx"
Text="Instructors">
<asp:MenuItem NavigateUrl="~/InstructorsCourses.aspx"
Text="Course Assignments" />
<asp:MenuItem NavigateUrl="~/OfficeAssignments.aspx"
Text="Office Assignments" />
</asp:MenuItem>
<asp:MenuItem NavigateUrl="~/Departments.aspx"
Text="Departments">
<asp:MenuItem NavigateUrl="~/DepartmentsAdd.aspx"
Text="Add Departments" />
</asp:MenuItem>
</Items>
</asp:Menu>
Abra la página Default.aspx y cambiar el control de Content llamado BodyContent a esto:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>
Welcome to Contoso University!
</h2>
</asp:Content>
Ahora tienes una simple página web con enlaces a las diferentes páginas que podrá estar creando:
SQL Server crea un diagrama de base de datos que muestra las tablas, las columnas de las tablas y
relaciones entre las tablas. Puede mover las mesas alrededor de organizarlos sin embargo te gusta.
3. Guardar el diagrama como "SchoolDiagram" y lo cerramos.
Si descarga el archivo School.mdf que acompaña este tutorial, usted puede ver el diagrama de base de
datos haciendo doble clic en SchoolDiagram bajo Esquemas de base de datos en el Explorador de
servidores.
El diagrama se ve algo como esto (las tablas pueden ser en lugares diferentes de lo que se muestra aquí):
Esto inicia al asistente de modelo de datos de entidad. En el primer paso del asistente, se selecciona la
opción degeneración de base de datos por defecto. Haga clic en siguiente.
En el paso de Elegir la conexión de datos , deje los valores predeterminados y haga clic en siguiente. La
base de datos School está seleccionada por defecto y la configuración de conexión se guarda en el
archivo Web.config comoSchoolEntities.
En el paso del asistente Elegir su base de datos de objetos , seleccione todos los cuadros
excepto sysdiagrams(que fue creado para el diagrama que generó anteriormente) y haga clic
en Finalizar.
Después de que ha terminado creando el modelo, Visual Studio muestra una representación gráfica de los
objetos de Entity Framework (entidades) que corresponden a las tablas de base de datos. (Como con el
diagrama de base de datos, la ubicación de los elementos individuales puede ser diferente de lo que ve en
esta ilustración. Puede arrastrar los elementos alrededor para que coincida con la ilustración si quieres).
Explorando el marco Entity Data Model
Puedes ver que el diagrama entidad es muy similar al diagrama de base de datos, con un par de
diferencias. Una diferencia es la adición de símbolos al final de cada asociación que indican el tipo de
asociación (relaciones de tablas se denominan asociaciones de entidad en el modelo de datos):
Una asociación de uno a cero-o-uno está representada por "1" y "decisionales".
En este caso, una entidad Person puede o no puede estar asociada con una
entidad OfficeAssignment . Una entidad OfficeAssignment debe estar asociada a una entidad
de Person . En otras palabras, un instructor puede o no puede ser asignado a una oficina, y cualquier
oficina puede asignarse a sólo un instructor.
Una asociación de uno a muchos es representada por "1" y "*".
En este caso, una entidad Person puede o no puede tener asociados StudentGrade entidades. Una
entidadStudentGrade debe estar asociada a una entidad de Person . StudentGrade entidades
representan realmente cursos inscritos en esta base de datos; Si un estudiante está matriculado en un
curso y todavía no hay ningún grado, el Grade propiedad es null. En otras palabras, un estudiante no
puede ser registrado en cualquier curso todavía, puede estar matriculado en un curso o puede estar
matriculado en cursos múltiples. Cada grado en un curso de inscrito se aplica a sólo un estudiante.
Una asociación de muchos-a-muchos está representada por "*" y "*".
En este caso, una entidad Person puede o no puede tener asociados Course entidades, y lo
contrario también es cierto: una entidad de Course pueden o no pueden tener asociados
entidades Person . En otras palabras, un instructor puede enseñar cursos múltiples, y un curso puede
ser impartido por instructores múltiples. (En esta base de datos, esta relación se aplica únicamente a
los instructores; no lo vincula estudiantes a cursos. Los estudiantes están ligados a cursos por la mesa
de StudentGrades.)
Otra diferencia entre el diagrama de base de datos y el modelo de datos es la sección de Propiedades de
navegación adicional para cada entidad. Una propiedad de navegación de una entidad hace referencia a
entidades relacionadas. Por ejemplo, la propiedad de Courses en una entidad Person contiene una
colección de todas las entidades de Course que están relacionadas con esa entidad de Person .
Sin embargo, otra diferencia entre el modelo de base de datos y datos es la ausencia de la tabla de
Asociación deCourseInstructor que se utiliza en la base de datos para vincular las
tablas Person y Course en una relación de varios a varios. Las propiedades de navegación le permiten
obtener entidades relacionadas del Course de la entidad de Person y entidades relacionadas de
la Person de la entidad de Course , así que no hay necesidad de representar la tabla de asociación en el
modelo de datos.
Para los propósitos de este tutorial, supongamos que la columna FirstName de la tabla Person contiene
en realidad tanto primer nombre y segundo nombre de una persona. Desea cambiar el nombre del campo
para reflejar esto, pero el administrador de base de datos (DBA) no quiera cambiar la base de datos. Puede
cambiar el nombre de la propiedad FirstName en el modelo de datos, dejando su base de datos
equivalente sin cambios.
En el diseñador, haga clic derecho en el apellido en la entidad de Person y luego seleccione Rename.
Escriba el nuevo nombre de "FirstMidName". Esto cambia la forma que hace referencia a la columna de
código sin cambiar la base de datos.
El navegador modelo proporciona otra forma de ver la estructura de base de datos, la estructura del
modelo de datos y la asignación entre ellos. Para verlo, haga clic derecho en un área vacía en el diseñador
de la entidad y haga clic en Explorador de modelos.
El panel Explorador de modelos muestra una vista de árbol. (El panel Explorador de modelos puede ser
acoplado con el panel Explorador de soluciones ). El nodo SchoolModel representa la estructura del
modelo de datos y el nodo SchoolModel.Store representa la estructura de base de datos.
Expanda SchoolModel.Store para ver las tablas, ampliar/tablas / vistas para ver las tablas y luego
ampliar cursopara ver las columnas de una tabla.
Expanda SchoolModel, ampliar los Tipos de entidady luego expanda el nodo del curso para ver si las
entidades y las propiedades dentro de las entidades.
En el panel Explorador de modelos o el diseñador se puede ver cómo el Entity Framework se refiere a los
objetos de los dos modelos. Haga clic derecho en la entidad de Person y seleccione Asignación de mesa.
Esto abre la ventana Detalles de mapeo . Tenga en cuenta que esta ventana permite ver que la columna
de base de datos FirstName se asigna a FirstMidName, que es lo cambió el nombre a que en el modelo
de datos.
Entity Framework utiliza XML para almacenar información sobre la base de datos, el modelo de datos y las
asignaciones entre ellos. El archivo SchoolModel.edmx es en realidad un archivo XML que contiene esta
información.El diseñador procesa la información en un formato gráfico, pero también puede ver el archivo
como XML haciendo clic en el archivo .edmx en el Explorador de soluciones, haga clic en Abrir cony
seleccionar Editor XML (texto). (El diseñador del modelo de datos y un editor de XML son sólo dos
formas diferentes de abrir y trabajar con el mismo archivo, así que no puedes tener el diseñador abrir y
abrir el archivo en un editor de XML al mismo tiempo).
Ahora han creado un sitio web, una base de datos y un modelo de datos. En el siguiente tutorial usted
comenzará a trabajar con datos utilizando el modelo de datos y el control ASP.NET EntityDataSource .
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 2
Por Tom Dykstra|03 de diciembre de 2010
Imprimir
La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie
El Control EntityDataSource
En el tutorial anterior creó un sitio web, una base de datos y un modelo de datos. En este tutorial se
trabaja con el control EntityDataSource que ASP.NET proporciona para hacerla fácil trabajar con un
modelo de datos de Entity Framework. Crearás un control GridView para mostrar y editar datos de los
estudiantes, un control DetailsViewpara agregar nuevos estudiantes y un control DropDownList para
seleccionar un departamento (que utilizará más tarde para la visualización de cursos asociados).
Tenga en cuenta que en esta aplicación no se agregar validación de entrada a páginas que actualización la
base de datos, y algunos de la gestión de errores no será tan robustos como serían necesarios en una
aplicación de producción. Eso mantiene el tutorial se centró en Entity Framework y mantiene poniendo
demasiado tiempo. Para obtener más información acerca de cómo agregar estas características a su
aplicación, consulte Validating User Input en páginas Web ASP.NET y Manejo de errores en las páginas
ASP.NET y aplicaciones.
Agregar y configurar el Control EntityDataSource
Empezarás por configurar un control EntityDataSource para leer las entidades Person desde el
conjunto de entidades de People .
Asegúrese de que tiene Visual Studio abiertos y que estás trabajando con el proyecto que ha creado en
parte 1. Si no has construido el proyecto desde que creó el modelo de datos o desde el último cambio
que lo hiciste, genere el proyecto ahora. Los cambios en el modelo de datos no estarán disponibles para el
diseñador hasta que el proyecto se construye.
Crear una nueva página web utilizando la plantilla de formulario de la Web utilizando la página
maestra y asígnele el nombre Students.aspx.
Especificar Site.Master como página maestra. Todas las páginas creadas para estos tutoriales utilizará esta
página maestra.
En la vista código fuente , añadir un encabezado h2 para el control de Content llamado Content2, como
se muestra en el ejemplo siguiente:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Student List</h2>
</asp:Content>
Desde la ficha de datos de la caja de herramientas, arrastre un control EntityDataSource a la página,
déjalo debajo del encabezado y cambiar el ID de StudentsEntityDataSource:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Student List</h2>
<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server">
</asp:EntityDataSource>
</asp:Content>
Cambie a la vista diseño , haga clic en la etiqueta inteligente del control origen de datos y haga clic
en Configurar origen de datos para iniciar al asistente Configurar origen de datos .
En el paso del asistente Configure ObjectContext , seleccione SchoolEntities como valor para
la Conexión de llamaday seleccione SchoolEntities como el valor DefaultContainerName . Haga clic
en siguiente.
Nota: Si tienes el siguiente cuadro de diálogo en este punto, tienes que construir el proyecto antes de
proceder.
Guarde y cierre el diagrama. Si te preguntan si desea actualizar la base de datos, haga clic en Sí.
Para asegurarse de que el modelo mantiene las entidades que están en la memoria en sintonía con lo que
está haciendo la base de datos, debe establecer las reglas correspondientes en el modelo de
datos. AbrirSchoolModel.edmx, haga clic derecho en la línea de asociación entre
la Person y StudentGradey a continuación, seleccione Propiedades.
Para ciertos tipos de cambios (por ejemplo, agregar o actualizar las tablas, vistas o procedimientos
almacenados), haga clic en el diseñador y seleccione Un modelo de actualización de base de
datos que tiene el diseñador hace los cambios automáticamente.
Regenerar el modelo de datos.
Realizar actualizaciones manuales como éste.
En este caso, usted podría haberse regenerado el modelo o actualiza las tablas afectadas por el cambio de
relación, pero entonces tendrías que hacer el cambio de nombre de campo
(de FirstName a FirstMidName).
Haga clic en Aceptar y luego cambiar a la vista de código fuente . Los cambios restantes serán más
fáciles de hacer directamente en el marcado. El marcado de control GridView parece ahora en el siguiente
ejemplo.
<asp:GridView ID="StudentsGridView" runat="server" AllowPaging="True"
AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="PersonID"
DataSourceID="StudentsEntityDataSource">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:TemplateField HeaderText="FirstMidName"
SortExpression="FirstMidName">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%#
Bind("FirstMidName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%#
Bind("FirstMidName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="EnrollmentDate"
SortExpression="EnrollmentDate">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%#
Bind("EnrollmentDate") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%#
Bind("EnrollmentDate") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
La primera columna después de que el campo de comando es una plantilla que actualmente muestra el
nombre del primero. Cambiar el marcado para este campo plantilla como en el siguiente ejemplo:
<asp:TemplateField HeaderText="Name" SortExpression="LastName">
<EditItemTemplate>
<asp:TextBox ID="LastNameTextBox" runat="server" Text='<%#
Bind("LastName") %>'></asp:TextBox>
<asp:TextBox ID="FirstNameTextBox" runat="server" Text='<%#
Bind("FirstMidName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="LastNameLabel" runat="server" Text='<%#
Eval("LastName") %>'></asp:Label>,
<asp:Label ID="FirstNameLabel" runat="server" Text='<%#
Eval("FirstMidName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
En modo de visualización, dos controles de Label muestran el nombre y apellido. En modo de edición,
dos cuadros de texto se suministran para que puede cambiar el nombre y apellido. Como con los
controles Label en modo de visualización, utilice expresiones se Bind y Eval exactamente como lo haría
con controles de origen de datos ASP.NET que se conectan directamente a las bases de datos. La única
diferencia es que usted especifica las propiedades de la entidad en lugar de columnas de base de datos.
La última columna es un campo de plantilla que muestra la fecha de inscripción. Cambiar el marcado para
este campo como en el siguiente ejemplo:
<asp:TemplateField HeaderText="Enrollment Date"
SortExpression="EnrollmentDate">
<EditItemTemplate>
<asp:TextBox ID="EnrollmentDateTextBox" runat="server" Text='<%#
Bind("EnrollmentDate", "{0:d}") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="EnrollmentDateLabel" runat="server" Text='<%#
Eval("EnrollmentDate", "{0:d}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Tanto en Mostrar y editar el modo, la cadena de formato "{0, d}" provoca la fecha que se mostrará en el
formato "fecha corta". (El equipo puede configurarse para mostrar este formato diferente de las imágenes
en pantalla que se muestra en este tutorial).
Observe que en cada uno de estos campos de la plantilla, el diseñador utiliza una expresión Bind de
forma predeterminada, pero eso cambió a una expresión Eval en los elementos de la ItemTemplate . La
expresión Bindpone los datos disponibles en las propiedades del control GridView en caso de que usted
necesita acceder a los datos en el código. En esta página no necesitas acceder a estos datos en el código,
así que puede usar Eval, que es más eficiente. Para obtener más información, ver los datos de los
controles de datos.
Haga clic en Editar en cualquier fila. Cuadros de texto se muestran donde puedes cambiar el nombre y
apellido.
También funciona el botón eliminar . Haga clic en borrar para una fila que tiene una fecha de inscripción y
la fila desaparece. (Filas sin fecha inscripción representan instructores y obtendrá un error de integridad
referencial. En el siguiente tutorial se podrá filtrar esta lista para incluir sólo los estudiantes.)
El método utilizas a databind del control mediante Entity Framework es el mismo con otros datos ASP.NET
especifica los controles de origen salvo que las entidades y las propiedades de la entidad.
Cambiar a la vista de código fuente y agregue "seleccione un departamento:" inmediatamente antes del
controlDropDownList .
Select a department:
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="EntityDataSource1" DataTextField="Name"
DataValueField="DepartmentID">
</asp:DropDownList>
Como recordatorio, cambiar el marcado para el control EntityDataSource en este momento
sustituyendo elConnectionString y DefaultContainerName atribuye con
unContextTypeName="ContosoUniversity.DAL.SchoolEntities" atributo. A menudo es mejor
esperar hasta después de que has creado el control enlazado a datos que está relacionado con el control
de origen de datos antes de cambiar el marcado control EntityDataSource , porque después de hacer el
cambio, el diseñador no le proporcionará una opción Actualizar esquema en el control enlazado a datos.
Ejecute la página y se puede seleccionar un departamento de la lista desplegable.
Esto completa la introducción al uso del control EntityDataSource . Trabajar con este control
generalmente no es diferente de trabajar con otros datos ASP.NET los controles de origen, excepto que
hace referencia a entidades y propiedades en lugar de tablas y columnas. La única excepción es cuando
quieres acceder a las propiedades de navegación. En el siguiente tutorial que verás que la sintaxis utilice
con control EntityDataSource también puede diferir de otros controles de origen de datos cuando se
filtren, grupo y datos de pedidos.
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 3
Por Tom Dykstra|03 de diciembre de 2010
Imprimir
La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie
Ahora que ha terminado con el diseñador, cambie a la vista de la fuente y cambiar las propiedades de
nombreConnectionString y DefaultContainer del control CoursesEntityDataSource con
elContextTypeName="ContosoUniversity.DAL.SchoolEntities" atributo. Cuando termines, el
marcado del control se verá como en el siguiente ejemplo.
<asp:EntityDataSource ID="CoursesEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="false"
EntitySetName="Courses"
AutoGenerateWhereClause="true" Where="">
<WhereParameters>
<asp:ControlParameter ControlID="DepartmentsDropDownList" Type="Int32"
Name="DepartmentID" PropertyName="SelectedValue" />
</WhereParameters>
</asp:EntityDataSource>
Ejecute la página y utilice la lista desplegable para seleccionar diferentes departamentos. Solamente los
cursos que son ofrecidos por el Departamento de seleccionados se muestran en el control GridView .
Mediante la propiedad "GroupBy" EntityDataSource a
grupo datos
Suponga Contoso Universidad quiere poner algunas estadísticas estudiantil en su página
sobre. Específicamente, quiere mostrar un desglose de los números de estudiantes antes de la fecha que
se matriculado.
Abra About.aspxy en la vista código fuente , reemplace el contenido existente del
control BodyContent con "Estudiante cuerpo estadísticas" entre etiquetas h2 :
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>Student Body Statistics</h2>
</asp:Content>
Después de la partida, agregue un control EntityDataSource y asígnele el
nombreStudentStatisticsEntityDataSource. Conectarlo a SchoolEntities, seleccione el conjunto
de entidades dePeople y deja el cuadro Seleccione el asistente sin cambios. Establezca las siguientes
propiedades en la ventanaPropiedades :
Para filtrar por estudiantes, establezca la propiedad Where it.EnrollmentDate is not null.
Para agrupar los resultados de la fecha de inscripción, establezca la
propiedad GroupBy it.EnrollmentDate.
Para seleccionar la fecha de inscripción y el número de estudiantes, establezca la
propiedad Select ait.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents.
Para ordenar los resultados de la fecha de inscripción, establezca la
propiedad OrderBy enit.EnrollmentDate.
En la vista código fuente , cambie las propiedades de
nombre ConnectionString y DefaultContainer con una propiedad ContextTypeName . El marcado de
control EntityDataSource ahora se asemeja del siguiente ejemplo.
<asp:EntityDataSource ID="StudentStatisticsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People"
Select="it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents"
OrderBy="it.EnrollmentDate" GroupBy="it.EnrollmentDate"
Where="it.EnrollmentDate is not null" >
</asp:EntityDataSource>
La sintaxis de las propiedades Select GroupByy Where se asemeja a Transact-SQL con excepción de la
clave it que especifica la entidad actual.
Agregue el siguiente marcado para crear un control GridView para mostrar los datos.
<asp:GridView ID="StudentStatisticsGridView" runat="server"
AutoGenerateColumns="False"
DataSourceID="StudentStatisticsEntityDataSource">
<Columns>
<asp:BoundField DataField="EnrollmentDate" DataFormatString="{0:d}"
HeaderText="Date of Enrollment"
ReadOnly="True" SortExpression="EnrollmentDate" />
<asp:BoundField DataField="NumberOfStudents" HeaderText="Students"
ReadOnly="True" SortExpression="NumberOfStudents" />
</Columns>
</asp:GridView>
Ejecute la página para ver una lista mostrando el número de alumnos por fecha de inscripción.
Entrar en una "m" y haga clic en Buscar para ver todos los cursos cuyos títulos comienzan con "m" (la
búsqueda no es caso sensible).
Usando el operador "Like" para filtrar datos
Puede lograr un efecto similar a la del control QueryExtender StartsWith, Containsy tipos de
búsquedaEndsWith mediante un operador Like en propiedad del control EntityDataSource Where . En
esta parte del tutorial, verás cómo utilizar el operador Like para la búsqueda de un estudiante por
nombre.
Abra Students.aspx en vista de código fuente . Después del control GridView , agregue el marcado
siguiente:
<h2>Find Students by Name</h2>
Enter any part of the name
<asp:TextBox ID="SearchTextBox" runat="server" AutoPostBack="true"></asp:TextBox>
<asp:Button ID="SearchButton" runat="server" Text="Search" />
<br />
<br />
<asp:EntityDataSource ID="SearchEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People"
Where="it.EnrollmentDate is not null and (it.FirstMidName Like '%' +
@StudentName + '%' or it.LastName Like '%' + @StudentName + '%')" >
<WhereParameters>
<asp:ControlParameter ControlID="SearchTextBox" Name="StudentName"
PropertyName="Text"
Type="String" DefaultValue="%"/>
</WhereParameters>
</asp:EntityDataSource>
<asp:GridView ID="SearchGridView" runat="server" AutoGenerateColumns="False"
DataKeyNames="PersonID"
DataSourceID="SearchEntityDataSource" AllowPaging="true">
<Columns>
<asp:TemplateField HeaderText="Name" SortExpression="LastName,
FirstMidName">
<ItemTemplate>
<asp:Label ID="LastNameFoundLabel" runat="server" Text='<%#
Eval("LastName") %>'></asp:Label>,
<asp:Label ID="FirstNameFoundLabel" runat="server" Text='<%#
Eval("FirstMidName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Enrollment Date"
SortExpression="EnrollmentDate">
<ItemTemplate>
<asp:Label ID="EnrollmentDateFoundLabel" runat="server" Text='<%#
Eval("EnrollmentDate", "{0:d}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Este marcado es similar a lo que has visto anteriormente excepto Where el valor de la propiedad. La
segunda parte de la expresión Where define una búsqueda de subcadenas (LIKE %FirstMidName% or
LIKE %LastName%) que busca los nombre y apellidos por lo que se escribe en el cuadro de texto.
Ejecutar la página. Inicialmente verás todos los estudiantes porque el valor predeterminado para el
parámetroStudentName es "%".
Escriba la letra "g" en el cuadro de texto y haga clic en Buscar. Verá una lista de estudiantes que tienen
una "g" ya sea en el nombre o apellido.
Has ahora aparece, actualizado, filtrado, ordenado y agrupar datos de tablas individuales. En el siguiente
tutorial comenzará a trabajar con datos relacionados (principal-detalle escenarios).
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 4
Por Tom Dykstra|03 de diciembre de 2010
Imprimir
La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie
Este control GridView permite la selección de filas, destaca la fila seleccionada con un color de fondo gris
claro y especifica los controladores (que crearás más adelante) para los
eventos SelectedIndexChanged y Updating .También especifica PersonID para la
propiedad DataKeyNames , así el valor de la clave de la fila seleccionada puede pasarse a otro control que
añadiremos más tarde.
La última columna contiene la asignación, del instructor oficina, que se almacena en una propiedad de
navegación de la entidad Person porque se trata de una entidad asociada. Observe que el
elemento EditItemTemplateespecifica Eval en lugar de Bind, porque el control GridView no se puede
enlazar directamente a las propiedades de navegación para actualizarlos. Usted podrá actualizar la
asignación de la oficina en el código. Para ello, necesitará una referencia al control TextBox , y podrá
conseguir y guarde en el evento Init del control TextBox .
Tras el control GridView es un control de Label que se utiliza para los mensajes de
error. Propiedad Visible del control es false, y el estado de vista está apagado, para que la etiqueta
aparecerá sólo cuando código hace visible en respuesta a un error.
Abra el archivo Instructors.aspx.cs y agregue la siguiente instrucción using :
using ContosoUniversity.DAL;
Agregar un campo de clase privada inmediatamente después de la declaración de clase parcial nombre
para mantener una referencia a la casilla de texto asignación.
try
{
if (String.IsNullOrWhiteSpace(instructorOfficeTextBox.Text) ==
false)
{
if (officeAssignment == null)
{
context.OfficeAssignments.AddObject(OfficeAssignment.CreateOfficeAssignment(instructo
rBeingUpdated, instructorOfficeTextBox.Text, null));
}
else
{
officeAssignment.Location = instructorOfficeTextBox.Text;
}
}
else
{
if (officeAssignment != null)
{
context.DeleteObject(officeAssignment);
}
}
context.SaveChanges();
}
catch (Exception)
{
e.Cancel = true;
ErrorMessageLabel.Visible = true;
ErrorMessageLabel.Text = "Update failed.";
//Add code to log the error.
}
}
}
Este código se ejecuta cuando el usuario hace clic en Actualizar en la fila de un GridView . El código
utiliza LINQ to Entities para recuperar la entidad OfficeAssignment que está asociado con la entidad
de Person actual, utilizando el PersonID de la fila seleccionada de la discusión del evento.
El código entonces realiza una de las siguientes acciones dependiendo del valor en el control
deInstructorOfficeTextBox :
Si el cuadro de texto tiene un valor y no hay ninguna entidad OfficeAssignment para actualizar,
crea uno.
Si el cuadro de texto tiene un valor y no hay una entidad OfficeAssignment , actualiza el valor de la
propiedad Location .
Si el cuadro de texto está vacío y existe una entidad OfficeAssignment , elimina la entidad.
Después de esto, salva los cambios a la base de datos. Si se produce una excepción, muestra un mensaje
de error.
Ejecutar la página.
Seleccione un instructor que tiene uno o más cursos asignados, y el curso o cursos que aparecen en la
lista. (Nota: Aunque el esquema de base de datos permite múltiples cursos, en los datos de prueba
suministrados con la base de datos instructor en realidad no tiene más de un curso. Usted puede agregar
cursos a la base de datos usando la ventana del Explorador de servidores o en la
página CoursesAdd.aspx , que añadiremos en un tutorial más adelante.)
El control CoursesGridView muestra sólo unos pocos campos de curso. Para mostrar todos los detalles
para un curso, que utilizará un control DetailsView para el curso que el usuario
selecciona. En Instructors.aspx, agregue el marcado siguiente después del cierre </div> etiqueta
(Asegúrese de colocar este marcado después de que el div de cierre de la etiqueta, no antes):
<div>
<h3>Course Details</h3>
<asp:EntityDataSource ID="CourseDetailsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="Courses"
AutoGenerateWhereClause="False" Where="it.CourseID = @CourseID"
Include="Department,OnlineCourse,OnsiteCourse,StudentGrades.Person"
OnSelected="CourseDetailsEntityDataSource_Selected">
<WhereParameters>
<asp:ControlParameter ControlID="CoursesGridView" Type="Int32"
Name="CourseID" PropertyName="SelectedValue" />
</WhereParameters>
</asp:EntityDataSource>
<asp:DetailsView ID="CourseDetailsView" runat="server"
AutoGenerateRows="False"
DataSourceID="CourseDetailsEntityDataSource">
<EmptyDataTemplate>
<p>
No course selected.</p>
</EmptyDataTemplate>
<Fields>
<asp:BoundField DataField="CourseID" HeaderText="ID" ReadOnly="True"
SortExpression="CourseID" />
<asp:BoundField DataField="Title" HeaderText="Title"
SortExpression="Title" />
<asp:BoundField DataField="Credits" HeaderText="Credits"
SortExpression="Credits" />
<asp:TemplateField HeaderText="Department">
<ItemTemplate>
<asp:Label ID="DetailsViewDepartmentLabel" runat="server"
Text='<%# Eval("Department.Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Location">
<ItemTemplate>
<asp:Label ID="LocationLabel" runat="server" Text='<%#
Eval("OnsiteCourse.Location") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="URL">
<ItemTemplate>
<asp:Label ID="URLLabel" runat="server" Text='<%#
Eval("OnlineCourse.URL") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Fields>
</asp:DetailsView>
</div>
Este marcado crea un control EntityDataSource que está enlazado con el conjunto de entidades
de Courses . La propiedad Where selecciona un curso utilizando el valor del CourseID de la fila
seleccionada en el control GridViewcursos. El marcado especifica un controlador para el
evento Selected , que utilizará más tarde para la visualización de calificaciones de los estudiantes, que es
otro nivel más bajo en la jerarquía.
En Instructors.aspx.cs, cree el siguiente trozo para el
método CourseDetailsEntityDataSource_Selected .(Podrás llenar este trozo más adelante en el
tutorial, por ahora, lo necesitas para que la página se compila y ejecuta).
protected void CourseDetailsEntityDataSource_Selected(object sender,
EntityDataSourceSelectedEventArgs e)
{
}
Ejecutar la página.
Inicialmente hay no hay detalles del curso porque no se ha seleccionado ningún curso. Seleccione un
instructor que tiene un curso asignado y a continuación, seleccione un curso para ver los detalles.
Usando el EntityDataSource "seleccionado" evento para
Mostrar datos relacionados
Por último, quieres Mostrar todos los alumnos y sus calificaciones para el curso seleccionado. Para ello,
utilizará el evento Selected del control EntityDataSource atado al curso DetailsView.
En Instructors.aspx, agregue el marcado siguiente después del control DetailsView :
<h3>Student Grades</h3>
<asp:ListView ID="GradesListView" runat="server">
<EmptyDataTemplate>
<p>No student grades found.</p>
</EmptyDataTemplate>
<LayoutTemplate>
<table border="1" runat="server" id="itemPlaceholderContainer">
<tr runat="server">
<th runat="server">
Name
</th>
<th runat="server">
Grade
</th>
</tr>
<tr id="itemPlaceholder" runat="server">
</tr>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td>
<asp:Label ID="StudentLastNameLabel" runat="server" Text='<%#
Eval("Person.LastName") %>' />,
<asp:Label ID="StudentFirstNameLabel" runat="server"
Text='<%# Eval("Person.FirstMidName") %>' />
</td>
<td>
<asp:Label ID="StudentGradeLabel" runat="server" Text='<%#
Eval("Grade") %>' />
</td>
</tr>
</ItemTemplate>
</asp:ListView>
Este marcado crea un control ListView que muestra una lista de los alumnos y sus calificaciones para el
curso seleccionado. Ningún origen de datos especificado porque tendrás databind del control en el
código. El elementoEmptyDataTemplate proporciona un mensaje que se mostrará cuando no se ha
seleccionado ningún curso — en ese caso, no hay ningún estudiante para mostrar. El
elemento LayoutTemplate crea una tabla HTML para mostrar la lista y la ItemTemplate especifica las
columnas para mostrar. El ID del estudiante y el grado del estudiante son de la entidad StudentGrade , y
el nombre del estudiante es de la entidad de la Person que pone a disposición de la propiedad de
navegación de la Person de la entidad StudentGrade Entity Framework.
En Instructors.aspx.cs, reemplace el método de CourseDetailsEntityDataSource_Selected de golpear
con el siguiente código:
protected void CourseDetailsEntityDataSource_Selected(object sender,
EntityDataSourceSelectedEventArgs e)
{
var course = e.Results.Cast<Course>().FirstOrDefault();
if (course != null)
{
var studentGrades = course.StudentGrades.ToList();
GradesListView.DataSource = studentGrades;
GradesListView.DataBind();
}
}
El argumento de evento para este evento proporciona los datos seleccionados en la forma de una
colección, que tendrá cero elementos si no se selecciona o un artículo si se selecciona una entidad
de Course . Si se selecciona una entidad de Course , el código utiliza el First método para convertir la
colección en un objeto único. A continuación obtiene entidades StudentGrade de la propiedad de
navegación, convierte a una colección y enlaza el controlGradesListView a la colección.
Esto es suficiente Mostrar grados, pero quiere asegurarse de que el mensaje en la plantilla de datos vacía
se muestra la primera vez que aparece la página y cuando no se selecciona un curso. Para ello, cree el
siguiente método, que se podrá llamar desde dos lugares:
private void ClearStudentGradesDataSource()
{
var emptyStudentGradesList = new List<StudentGrade>();
GradesListView.DataSource = emptyStudentGradesList;
GradesListView.DataBind();
}
Llame a este nuevo método del método Page_Load para mostrar la hora de la primera plantilla de datos
vacía que se muestra la página. Y llamarlo desde el
método InstructorsGridView_SelectedIndexChanged porque ese evento se produce cuando se
selecciona un instructor, que significa nuevos cursos se cargan en el control GridViewcursos y ninguno se
ha seleccionado todavía. Aquí están las dos llamadas:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ClearStudentGradesDataSource();
}
}
protected void InstructorsGridView_SelectedIndexChanged(object sender,
EventArgs e)
{
ClearStudentGradesDataSource();
}
Ejecutar la página.
La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie
También crearás una página que trabaja con una relación muchos-a-muchos mediante la asignación de un
instructor de un curso (añadiendo una relación entre dos entidades que selecciona) o quitar un instructor
de un curso (eliminación de una relación entre dos entidades que se selecciona). En la base de datos,
agregando una relación entre un instructor y un curso en una nueva fila se agrega a la tabla de Asociación
de CourseInstructor ; quitar una relación consiste en eliminar una fila de la tabla de Asociación
de CourseInstructor . Sin embargo, haces esto en Entity Framework estableciendo las propiedades de
navegación, sin referirse explícitamente a la tablaCourseInstructor .
Adición de una entidad con una relación con una entidad
existente
Crear una nueva página web denominada CoursesAdd.aspx que utiliza la Página principal Site.Master y
agregue el siguiente marcado para el control de Content llamado Content2:
<h2>Add Courses</h2>
<asp:EntityDataSource ID="CoursesEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="Courses"
EnableInsert="True" EnableDelete="True" >
</asp:EntityDataSource>
<asp:DetailsView ID="CoursesDetailsView" runat="server" AutoGenerateRows="False"
DataSourceID="CoursesEntityDataSource" DataKeyNames="CourseID"
DefaultMode="Insert" oniteminserting="CoursesDetailsView_ItemInserting">
<Fields>
<asp:BoundField DataField="CourseID" HeaderText="ID" />
<asp:BoundField DataField="Title" HeaderText="Title" />
<asp:BoundField DataField="Credits" HeaderText="Credits" />
<asp:TemplateField HeaderText="Department">
<InsertItemTemplate>
<asp:EntityDataSource ID="DepartmentsEntityDataSource"
runat="server" ConnectionString="name=SchoolEntities"
DefaultContainerName="SchoolEntities" EnableDelete="True"
EnableFlattening="False"
EntitySetName="Departments" EntityTypeFilter="Department">
</asp:EntityDataSource>
<asp:DropDownList ID="DepartmentsDropDownList" runat="server"
DataSourceID="DepartmentsEntityDataSource"
DataTextField="Name" DataValueField="DepartmentID"
oninit="DepartmentsDropDownList_Init">
</asp:DropDownList>
</InsertItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowInsertButton="True" />
</Fields>
</asp:DetailsView>
Este marcado crea un control EntityDataSource que selecciona cursos, que permite insertar y que
especifica un controlador para el evento de Inserting . Utilizarás el controlador para actualizar
el Department propiedad de navegación cuando se crea una nueva entidad de Course .
El marcado también crea un control DetailsView para agregar nuevas entidades de Course . El marcado
utiliza campos enlazados por Course propiedades de entidad. Tienes que introducir el valor
de CourseID porque esto no es un campo generado por el sistema de identificación. En cambio, es un
número del curso que debe especificarse manualmente cuando se crea el curso.
Utilice un campo de plantilla para la propiedad de navegación Department porque las propiedades de
navegación no pueden utilizarse con controles BoundField . El campo plantilla proporciona una lista
desplegable para seleccionar el departamento. La lista desplegable está ligada a la entidad
de Departments establecer usando Evalen lugar de Bind, otra vez porque usted no puede enlazar
directamente las propiedades de navegación para actualizarlos. Especifica un controlador para el
evento Init del control DropDownList para que usted puede almacenar una referencia al control para su
uso por el código que actualiza la clave externa DepartmentID .
En CoursesAdd.aspx.cs justo después de la declaración de clase parcial, agregar un campo de clase que
contenga una referencia al control DepartmentsDropDownList :
private DropDownList departmentDropDownList;
Agregar un controlador para el evento Init del control DepartmentsDropDownList para que usted
puede almacenar una referencia al control. Esto le permite obtener el valor que el usuario ha introducido y
utilizarlo para actualizar el valor DepartmentID de la entidad de Course .
protected void DepartmentsDropDownList_Init(object sender, EventArgs e)
{
departmentDropDownList = sender as DropDownList;
}
Agregar un controlador para el evento del control DetailsView Inserting :
protected void CoursesDetailsView_ItemInserting(object sender,
DetailsViewInsertEventArgs e)
{
var departmentID = Convert.ToInt32(departmentDropDownList.SelectedValue);
e.Values["DepartmentID"] = departmentID;
}
Cuando el usuario hace clic en Insert, se provoca el evento de Inserting antes de inserta el nuevo
récord. El código en el controlador recibe el DepartmentID del control DropDownList y lo utiliza para
establecer el valor que se utilizará para la propiedad DepartmentID de la entidad de Course .
Entity Framework se ocupará de agregar este curso a la propiedad de navegación de Courses de la
entidad asociada del Department . El Departamento también agrega a la propiedad de navegación
del Department de la entidad deCourse .
Ejecutar la página.
Introduzca un ID, un título, un número de créditos y seleccione un departamento, luego haga clic
en Insertar.
Ejecutar la página Courses.aspx y seleccione el mismo departamento para ver el nuevo curso.
Un control DropDownList para seleccionar un curso para asignar. Este control se popularán con los
cursos que actualmente no están asignados al instructor seleccionado.
Un control de Button para iniciar la tarea.
Un control Label para mostrar un mensaje de error si falla la asignación.
Finalmente, el marcado también crea un grupo de controles para quitar un curso de instructor
seleccionado.
var instructorID =
Convert.ToInt32(InstructorsDropDownList.SelectedValue);
var instructor = (from p in context.People.Include("Courses")
where p.PersonID == instructorID
select p).First();
UnassignedCoursesDropDownList.DataSource = unassignedCourses;
UnassignedCoursesDropDownList.DataBind();
UnassignedCoursesDropDownList.Visible = true;
AssignedCoursesDropDownList.DataSource = assignedCourses;
AssignedCoursesDropDownList.DataBind();
AssignedCoursesDropDownList.Visible = true;
}
}
Este código obtiene todos los cursos desde el conjunto de entidades Courses y recibe los cursos de la
propiedad de navegación de Courses de la entidad de Person para el instructor seleccionado. A
continuación, determina qué cursos son asignados a ese instructor y rellena las listas desplegables en
consecuencia.
Agregar un controlador para el evento Click del botón Assign :
protected void AssignCourseButton_Click(object sender, EventArgs e)
{
using (var context = new SchoolEntities())
{
var instructorID =
Convert.ToInt32(InstructorsDropDownList.SelectedValue);
var instructor = (from p in context.People
where p.PersonID == instructorID
select p).First();
var courseID =
Convert.ToInt32(UnassignedCoursesDropDownList.SelectedValue);
var course = (from c in context.Courses
where c.CourseID == courseID
select c).First();
instructor.Courses.Add(course);
try
{
context.SaveChanges();
PopulateDropDownLists();
CourseAssignedLabel.Text = "Assignment successful.";
}
catch (Exception)
{
CourseAssignedLabel.Text = "Assignment unsuccessful.";
//Add code to log the error.
}
CourseAssignedLabel.Visible = true;
}
}
Este código obtiene la entidad Person para el instructor seleccionado, obtiene la entidad del Course del
curso seleccionado y agrega la propiedad de navegación Courses de entidad de Person del instructor del
curso seleccionado. Luego guarda los cambios a la base de datos y vuelve a llenar las listas desplegables
para que los resultados pueden verse inmediatamente.
Agregar un controlador para el evento Click del botón Remove :
protected void RemoveCourseButton_Click(object sender, EventArgs e)
{
using (var context = new SchoolEntities())
{
var instructorID =
Convert.ToInt32(InstructorsDropDownList.SelectedValue);
var instructor = (from p in context.People
where p.PersonID == instructorID
select p).First();
var courseID =
Convert.ToInt32(AssignedCoursesDropDownList.SelectedValue);
var courses = instructor.Courses;
var courseToRemove = new Course();
foreach (Course c in courses)
{
if (c.CourseID == courseID)
{
courseToRemove = c;
break;
}
}
try
{
courses.Remove(courseToRemove);
context.SaveChanges();
PopulateDropDownLists();
CourseRemovedLabel.Text = "Removal successful.";
}
catch (Exception)
{
CourseRemovedLabel.Text = "Removal unsuccessful.";
//Add code to log the error.
}
CourseRemovedLabel.Visible = true;
}
}
Este código obtiene la entidad Person para el instructor seleccionado, obtiene la entidad del Course del
curso seleccionado y elimina del curso seleccionado de propiedad de la
entidad Person Courses navegación. Luego guarda los cambios a la base de datos y vuelve a llenar las
listas desplegables para que los resultados pueden verse inmediatamente.
Agregue código al método Page_Load que asegura que los mensajes de error no son visibles cuando no
hay ningún error para informar y agregar controladores para que los eventos SelectedIndexChanged de
la lista desplegable de instructores y DataBound rellenar las listas desplegables de cursos:
protected void Page_Load(object sender, EventArgs e)
{
CourseAssignedLabel.Visible = false;
CourseRemovedLabel.Visible = false;
}
La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie
Puede configurar el Entity Framework para crear Instructor y Student entidades que heredan de la
entidadPerson . Este patrón de generar una estructura de herencia de entidad de una tabla de base de
datos se denomina herencia de tabla por jerarquía (TPH).
Para los cursos, la School base de datos utiliza un patrón diferente. Cursos en línea y en el sitio se
almacenan en tablas separadas, cada una de ellas tiene una clave externa que apunta a la
tabla Course . Información común a ambos tipos de cursos se almacena solamente en la tabla Course .
Puede configurar el modelo de datos de Entity Framework para que las
entidades OnlineCourse y OnsiteCourseheredan de la entidad de Course . Este patrón de generar una
estructura de herencia de entidad de mesas separadas para cada tipo, con cada mesa separada
refiriéndose a una tabla que almacena los datos comunes a todos los tipos, se denomina herencia de tabla
por tipo (TPT).
Los patrones de herencia TPH generalmente ofrecen mejor rendimiento en Entity Framework que los
patrones de herencia TPT, porque pueden producir patrones de TPT en consultas complejas unen. En este
tutorial se muestra cómo implementar la herencia de TPH. Harás realizando los siguientes pasos:
Crear tipos de entidad de Instructor y los Student que se derivan de la Person.
Mover propiedades que pertenecen a las entidades derivadas de la entidad de Person a las
entidades derivadas.
Definir restricciones sobre las propiedades de los tipos derivados.
La entidad Person hacer un ente abstracto.
Mapa de cada entidad derivada a la mesa de la Person con una condición que especifica cómo
determinar si una Person fila representa ese tipo derivado.
Repita el procedimiento para crear una entidad Student que deriva también de la Person.
Sólo los instructores tienen fechas de alquiler, así que tienes que mover esa propiedad de la entidad de
la Person a la entidad Instructor . En la entidad de Person , haga clic derecho en la
propiedad HireDate y haga clic encortar. Luego haga clic derecho en Propiedades en la
entidad Instructor y haga clic en pegar.
La fecha de contratación de una entidad de Instructor no puede ser null. Haga clic derecho en la
propiedadHireDate , haga clic en Propiedadesy luego en la
ventana Propiedades cambiar Nullable en False.
Repita el procedimiento para la entidad de Students , especificando que esta entidad se asigna a la
tabla Personcuando la columna de EnrollmentDate no es null. Guarde y cierre el modelo de datos.
Genere el proyecto con el fin de crear las nuevas entidades como clases y hacerlos disponibles en el
diseñador.
Sin embargo, porque has cambiado el marcado para control EntityDataSource se utiliza el
atributoContextTypeName , no puede ejecutar al asistente para Configurar origen de datos en
controlesEntityDataSource que ya ha creado. Por lo tanto, harán que los cambios requeridos por el
cambio marcado en su lugar.
Abra la página Students.aspx . En el control de StudentsEntityDataSource , quitar el atributo Where y
añadir unaEntityTypeFilter="Student" atributo. El marcado ahora parecerá en el siguiente ejemplo:
<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People" EntityTypeFilter="Student"
Include="StudentGrades"
EnableDelete="True" EnableUpdate="True"
OrderBy="it.LastName" >
</asp:EntityDataSource>
Establecer la EntityTypeFilter atributo asegura que el control EntityDataSource seleccionará
únicamente el tipo de entidad especificada. Si quería recuperar los tipos de
entidad Instructor y Student , no se establecería este atributo. (Usted tiene la opción de recuperar
varios tipos de entidad con un solo control EntityDataSourcesolamente si está usando el control de
acceso a datos de sólo lectura. Si estás usando un controlEntityDataSource para insertar, actualizar o
eliminar entidades, y el conjunto de entidades que es obligado puede contener varios tipos, sólo puede
trabajar con el tipo de una sola entidad, y tienes que configurar este atributo.)
Repita el procedimiento para el control de SearchEntityDataSource , excepto extraer solamente la parte
del atributo Where que selecciona las entidades Student en vez de quitar la propiedad en conjunto. La
etiqueta de apertura del control ahora parecerá en el siguiente ejemplo:
<asp:EntityDataSource ID="SearchEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People" EntityTypeFilter="Student"
Where="it.FirstMidName Like '%' + @StudentName + '%' or it.LastName Like '%'
+ @StudentName + '%'" >
Ejecute la página para verificar que todavía funciona como lo hacía antes.
Actualización de las páginas siguientes que creaste en tutoriales anteriores así que utilizan las nuevas
entidadesInstructor y Student en lugar de las entidades de la Person y luego ejecutarlos para verificar
que funcionan como lo hicieron antes:
En StudentsAdd.aspx, agregue EntityTypeFilter="Student" al
control StudentsEntityDataSource . El marcado ahora parecerá en el siguiente ejemplo:
<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People" EntityTypeFilter="Student"
EnableInsert="True"
</asp:EntityDataSource>
En About.aspx, agregue EntityTypeFilter="Student" a
la StudentStatisticsEntityDataSource de control y quitar Where="it.EnrollmentDate is
not null". El marcado ahora parecerá en el siguiente ejemplo:
<asp:EntityDataSource ID="StudentStatisticsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People" EntityTypeFilter="Student"
Select="it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents"
OrderBy="it.EnrollmentDate" GroupBy="it.EnrollmentDate" >
</asp:EntityDataSource>
</asp:EntityDataSource>
El marcado en InstructorsCourses.aspx ahora parecerá en el siguiente ejemplo:
<asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
EnableFlattening="False"
EntitySetName="People" EntityTypeFilter="Instructor"
Select="it.LastName + ',' + it.FirstMidName AS Name, it.PersonID">
</asp:EntityDataSource>
Como resultado de estos cambios, ha mejorado la mantenibilidad de la aplicación Contoso Universidad de
varias maneras. Has movido lógica selección y validación de la capa de interfaz de usuario (.aspx markup) y
lo hizo parte integral de la capa de acceso a datos. Esto ayuda a aislar el código de la aplicación de los
cambios que usted puede hacer en el futuro para el esquema de base de datos o el modelo de datos. Por
ejemplo, usted podría decidir que los estudiantes podrían ser contratados como auxiliares docentes y por
lo tanto tendría una fecha de contratación.Entonces usted podría agregar una nueva propiedad para
diferenciar a los estudiantes de instructores y actualizar el modelo de datos. Ningún código en la
aplicación web tendría que modificar excepto donde querías mostrar una fecha de contratación para los
estudiantes. Otro beneficio de agregar entidades Instructor y Student es que el código es más
fácilmente comprensible que cuando se refiere a Person objetos que eran realmente estudiantes o
profesores.
Ahora has visto una forma de implementar un patrón de herencia en Entity Framework. En el siguiente
tutorial, aprenderá cómo utilizar procedimientos almacenados con el fin de tener más control sobre cómo
el Entity Framework tiene acceso a la base de datos.
Empezando primero con entidad
Framework 4.0 de bases de datos y
formularios ASP.NET Web 4 - parte 7
Por Tom Dykstra|03 de diciembre de 2010
Imprimir
La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie
Ajuste la función Insertar InsertStudent. La ventana muestra una lista de parámetros del
procedimiento almacenado, cada uno de los cuales se debe asignar a la propiedad de una entidad. Dos de
éstos se asignan automáticamente porque los nombres son iguales. No hay ninguna entidad propiedad
llamada FirstName, entonces debe seleccionar manualmente FirstMidName de una lista desplegable que
muestra las propiedades disponibles de la entidad. (Esto es porque cambió el nombre de la
propiedad FirstName a FirstMidName en el primer tutorial).
En la misma ventana de Asignación de datos , asignar la función de Update al
procedimiento UpdateStudentalmacenado (Asegúrese de que especifica FirstMidName como el valor del
parámetro para el FirstName, como para la Insert procedimiento almacenado) y la función
de Delete el DeletePerson procedimiento almacenado.
Siga el mismo procedimiento para asignar el insertar, actualizar y eliminar procedimientos almacenados
para instructores de la entidad Instructor .
Para los procedimientos almacenados que leer en lugar de actualizan los datos, utilice la
ventana Explorador de modelos para mapear el procedimiento almacenado que devuelve el tipo de
entidad. En el diseñador del modelo de datos, haga clic derecho en la superficie de diseño y
seleccione Explorador de modelos. Abra el nodoSchoolModel.Store y a continuación, abra el
nodo Stored Procedures . A continuación haga clic derecho en el
procedimiento GetCourses almacenado y seleccione Agregar función de importación.
En el cuadro de diálogo Agregar función de importación bajo devuelve una colección
de seleccionar entidadesy luego seleccione Course como el tipo de entidad devuelto. Cuando haya
terminado, haga clic en Aceptar. Guarde y cierre el archivo .edmx .
Utilizando insertar, actualizar y eliminar procedimientos
almacenados
Procedimientos almacenados para insertar, actualizar y eliminar datos son utilizados por Entity Framework
automáticamente después de haber agregado al modelo de datos y les asignan a las entidades
apropiadas. Ya puedes ejecutar la página StudentsAdd.aspx , y cada vez que se crea una nueva estudiante,
Entity Framework utilizará el procedimiento InsertStudent almacenado para añadir la nueva fila a la
tabla Student .
Ejecute la página Students.aspx y el nuevo alumno aparece en la lista.
Cambie el nombre para comprobar que funciona la función de actualización y a continuación, elimine el
estudiante para comprobar que funciona la función de eliminar.
La aplicación web de Contoso Universidad muestra demuestra cómo crear aplicaciones Web ASP.NET
formas utilizando la entidad Framework 4.0 y Visual Studio 2010. Para obtener más información sobre la
serie de tutoriales, ver el primer tutorial de la serie
Datos dinámicos también validará que los datos introducidos en el campo Fecha de inscripción están
una fecha válida:
Como puedes ver, este es un mensaje de error genérico. En la siguiente sección, verá cómo personalizar
los mensajes así como validación y reglas de formato.
Agregar metadatos al modelo de datos
Normalmente, quieres personalizar la funcionalidad proporcionada por datos dinámicos. Por ejemplo,
cambie el modo de visualización de datos y el contenido de los mensajes de error. Es típicamente también
personalizar las reglas de validación de datos para proporcionar más funcionalidad que lo proporciona
datos dinámicos automáticamente basándose en los tipos de datos. Para hacer esto, es crear clases
parciales que corresponden a tipos de entidad.
En el Explorador de soluciones, haga clic derecho en el proyecto ContosoUniversity ,
seleccione Agregar referenciay agregar una referencia
a System.ComponentModel.DataAnnotations.
En la carpeta DAL , crear un nuevo archivo de clase, el nombre Student.csy reemplace el código de plantilla
en él con el siguiente código.
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace ContosoUniversity.DAL
{
[MetadataType(typeof(StudentMetadata))]
public partial class Student
{
}
Editar una fila y tratar de borrar los valores en los campos de nombre. Los asteriscos que indican errores
de campo aparecen tan pronto como se deja un campo, antes de hacer clic en Actualizar. Cuando hace
clic en Update, la página muestra el texto del mensaje de error especificado.
Intente introducir nombres que son más de 25 caracteres, haga clic en Updatey la página muestra el
texto del mensaje de error especificado.
Ahora que ya has engañado estas reglas de formato y validación en los metadatos del modelo de datos,
las reglas se aplicarán automáticamente en cada página que muestra o permite hacer cambios a estos
campos, mientras utilizasDynamicControl o DynamicField controla. Esto reduce la cantidad de código
redundante tienes que escribir, que hace programación y pruebas más fácil, y se asegura de que el
formato de datos y validación son consistentes a través de una aplicación.
Más información
Esto concluye esta serie de tutoriales sobre cómo empezar con Entity Framework. Para más recursos para
ayudarle a aprender cómo usar Entity Framework, continuarcon con el primer tutorial en la siguiente serie
de tutoriales de Entity Framework , o visitan los siguientes sitios:
Entity Framework FAQ
El Blog del equipo marco entidad
Entity Framework en MSDN Library
Entity Framework en datos MSDN Developer Center
Resumen de Control de servidor Web EntityDataSource en MSDN Library
Control EntityDataSource referencia de la API en MSDN Library
Entidad marco foros de MSDN
Blog de Julie Lerman