Академический Документы
Профессиональный Документы
Культура Документы
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.
Versiones de software
Se muestra
en el tutorial
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.
Esta plantilla crea un proyecto de aplicacin web que ya incluye una hoja de estilos y pginas maestras:
<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:
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.
2.
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):
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).
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
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 .
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.
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.
verificacin seleccionarll. Seleccione las opciones que permiten actualizar y eliminar. Cuando haya
terminado, haga clic en Finalizar.
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.
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
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.
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).
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.
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.
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.
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.)
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.)
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.
No pasar nada despus de insertar un nuevo alumno, pero si ahora ejecutar Students.aspx, vers la nueva
informacin del estudiante.
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.
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.)
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 .
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 .
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).
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).
<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>
}
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;
Cambiar cualquiera de estos valores, incluyendo la Asignacin de la oficina. Haga clic en Actualizar y
vers los cambios reflejados en la lista.
</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.
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.
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 .
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.
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.
{
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
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 .
Base enPerson.
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.
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.
de mapeo. En la ventana
de Detalles de asignacin, haga clic en agregar una tabla o vista y seleccione persona.
/ 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.
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
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>
</asp:EntityDataSource>
(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
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;
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
de procedimiento almacenado.
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).
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 seleccionar entidadesy luego seleccione Course como el tipo de entidad devuelto. Cuando haya
terminado, haga clic en Aceptar. Guarde y cierre el archivo .edmx .
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.
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 .
de
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:
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.
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.
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