entity net framework
DESCRIPTION
trabajo de bases de datos 2009TRANSCRIPT
2011
Universidad de El Salvador.
Facultad Multidisciplinaria de Occidente.
Departamento de ingeniería y Arquitectura.
Presentado por:
Juan José Abarca Mena.
Kelvin Geovanni Chicas.
Walter Arévalo Moran.
Luis Ernesto Martínez.
Wallace Steed Velasquez.
23/05/2011
Entity Framework.Net
Página 2
Universidad de El Salvador.
Introducción.
ADO.NET Entity Framework admite aplicaciones y servicios centrados en datos, y proporciona una
plataforma para la programación con datos que eleva el nivel de abstracción del nivel lógico
relacional al nivel conceptual. Al permitir a los programadores trabajar con datos en un nivel de
abstracción superior, Entity Framework admite código que es independiente de cualquier motor
de almacenamiento de datos o esquema relacional determinados. Para obtener más información,
vea Información general de Entity Framework.
Entity Framework admite Entity Data Model (EDM) para definir datos en el nivel conceptual.
Cuando se usa ADO.NET Entity Data Model Designer, la información sobre la asignación, el modelo
conceptual y el de almacenamiento se almacena en un archivo .edmx. Entity Framework también
permite a los desarrolladores programar directamente con los tipos de datos definidos en el nivel
conceptual como objetos de Common Language Runtime (CLR). Entity Framework proporciona
herramientas para generar un archivo .edmx y los objetos de CLR relacionados basándose en una
base de datos existente. Esto reduce en gran medida el código de acceso a datos que se solía
necesitar para crear aplicaciones y servicios de datos basados en objetos, y agiliza la creación de
servicios y aplicaciones de datos orientadas a objetos a partir de una base de datos existente. Las
herramientas también permiten compilar en primer lugar un modelo conceptual y, a continuación,
generar automáticamente los objetos de CLR relacionados y una base de datos auxiliar.
Página 3
Universidad de El Salvador.
¿Qué es Entity Framework. Net?
Entity Framework es un conjunto de tecnologías de ADO.NET que permiten el desarrollo de
aplicaciones de software orientadas a datos. Los arquitectos y programadores de aplicaciones
orientadas a datos se han enfrentado a la necesidad de lograr dos objetivos muy diferentes. Deben
modelar las entidades, las relaciones y la lógica de los problemas empresariales que resuelven, y
también deben trabajar con los motores de datos que se usan para almacenar y recuperar los
datos. Los datos pueden abarcar varios sistemas de almacenamiento, cada uno con sus propios
protocolos; incluso las aplicaciones que funcionan con un único sistema de almacenamiento deben
equilibrar los requisitos del sistema de almacenamiento con respecto a los requisitos de escribir
un código de aplicación eficaz y fácil de mantener.
Entity Framework permite a los programadores trabajar con datos en forma de objetos y
propiedades específicos del dominio, por ejemplo, con clientes y direcciones, sin tener que pensar
en las tablas de las bases de datos subyacentes y en las columnas en las que se almacenan estos
datos. Con Entity Framework , los desarrolladores de software pueden trabajar en un nivel más
alto de abstracción cuando tratan con datos, y puede crear y mantener aplicaciones orientadas a
datos con menos código que en las aplicaciones tradicionales. Dado que Entity Framework es un
componente de .NET Framework, las aplicaciones de Entity Framework se pueden ejecutar en
cualquier equipo en el que esté instalado .NET Framework a partir de la versión 3.5 SP1.
Página 4
Universidad de El Salvador.
Por otra parte, como todo marco de trabajo, Entity Framework incluye dos componentes
fundamentales:
� Recursos para el entorno de desarrollo y en particular un asistente para el diseño visual
de modelos de entidades dentro de Visual Studio asi como la generacion de codigo a partir
de los mismos.
� Biblioteca. Los tipos que componen ADO.NET EF se implementan fisicamente en
el ensamblado System.Data.Entity. La organización lógica de eso tipos es tal y como se
muestra en la tabla a continuación. Todo esto refuerza la idea de la pertenencia de EF a la
familia de ADO.NET.
Tabla 1. Espacios de nombres relacionados con Entity Framework.
Página 5
Universidad de El Salvador.
Arquitectura y componentes
ADO.NET Entity framework 4.0 se apoya en seis elementos fundamentales construidos encima de
todas las bases de ADO.NET, tal y como podemos ver en la siguiente figura:
Figura 1. Componentes principales de ADO.NET Entity Framework 4.0
A continuacion, presentamos los conceptos fundamentales relacionados con cada uno de estos
elementos (de abajo hacia arriba), profundizando en cada uno de ellos de forma practica.
Proveedores específicos. Una de las características más atractivas de ADO.NET EF es su “agnosticismo” con relacion a la
base de datos contra la que se trabaja. En verdad, Entity Framework es una implementacion
de un Data Mapper entre las entidades definidas en un modelo conceptual y el esquema
fisico de la base de datos subyacente. Por defecto, en la actual version de esta tecnologia
tendremos un proveedor especifico para Sql Server, en todas sus versiones 2000, 2005 y por
supuesto 2008 y 2008 R2.
La posibilidad de crear aplicaciones multi-base de datos es cada vez ms un requisito
indispensable para fabricantes de software, tambien conocidos por sus siglas ISV (Independent
Software Vendors), y departamentos de informatica de grandes corporaciones donde la
seleccion del motor de la base de datos podra variar entre cambios organizativos y de directores.
Logicamente, el hecho de que las aplicaciones puedan soportar multiples motores relacionales
es un valor añadido para aquellas empresas que quieran colocar su producto en el mercado. La
Página 6
Universidad de El Salvador.
posibilidad de implantar su producto en una empresa que usen como norma SQL Server pero
tambien poder implementar el mismo en otra empresa con Oracle es algo que les puede
proporcionar pingues beneficios.
La lista aproximada de proveedores disponibles puede verse en la siguiente tabla:
Tabla 2. Lista de algunos proveedores de ADO.NET Entity Framework 4.0.
Entity Data Model El primero de los elementos fundamentales en la arquitectura de ADO.NET Entity Framework es
el Modelo de Entidades, normalmente conocido como EDM. Este diseñador nos permite
definir los conjuntos de entidades y relaciones entre las mismas de nuestros modelos
conceptuales, así como especificar de qué manera estos tipos se mapearan a la estructura de la
fuente de almacenamiento relacional subyacente. Para apoyar a EDM, disponemos de una serie de
herramientas integradas dentro del entorno que nos ayudaran a crear nuestros modelos
conceptuales. A continuación pasaremos a detallar el funcionamiento y objetivo de cada una de
ellas:
Página 7
Universidad de El Salvador.
Diseñador de modelos EDM (Entity Data Model Designer)
El diseñador de modelos es una herramienta visual integrada dentro de Visual Studio 2010 que
permite crear y editar modelos conceptuales. Este diseñador está formado por los siguientes
componentes:
• Una superficie de diseño para crear y editar los modelos de una forma r pida similar al
trabajo con los diagramas de clases de Visual Studio.
• Una ventana de detalles de mapeo, que nos permitirá ver y editar los mapeos entre los
elementos del modelo conceptual y del esquema de la base de datos con la que
estemos trabajando.
• Una ventana de navegación por el modelo, en la cual podremos ver arboles de
información sobre el modelo conceptual y el modelo físico.
• Nuevos elementos dentro de la ventana de herramientas, que nos permitirán, por
ejemplo, crear las entidades, las asociaciones o relaciones de herencia.
El diseñador de modelos opera sobre ficheros de tipo edmx. Estos ficheros se forman mediante la
combinación de tres secciones de metadatos en formato XML (que en ocasiones pueden
presentarse también como ficheros independientes), llamadas respectivamente SSDL, CSDL y
MSL.
• SSDL (Storage Schema Definition Language) describe la estructura fisica de la base
de datos subyacente, incluyendo la definición de las tablas, columnas, vistas,
procedimientos almacenados y relaciones entre los distintos objetos de la misma.
• CSDK (Conceptual Schema Definition Language) describe las entidades que deseamos
tener en nuestro modelo conceptual, así como las propiedades de navegación o
asociación es entre las distintas entidades.
• Para terminar, el archivo edmx contiene la sección MSL (Mapping Schema Language),
también conocida como sección C-S, mediante la cual se especifican como se asocian
o relacionan las entidades del modelo conceptual (definido en la sección CSDK) con las
tablas, vistas, columnas, etc. Del modelo físico definido en la sección SSDL.
Página 8
Universidad de El Salvador.
Figura 2.- Secciones de metadatos de un modelo EDMX.
Una vez que se agrega dentro de un proyecto de Visual Studio 2010 el elemento ADO.NET Entity
Data Model, el asistente de modelos (del que hablaremos a continuación) crea un nuevo archivo
edmx y lo agrega al proyecto en el que estemos trabajando. La siguiente figura, nos muestra un
ejemplo de un diseñador EDM y las distintas ventanas de herramientas con las que podemos
trabajar:
Figura 3. Diseñador de EDM integrado en Visual Studio 2010.
Página 9
Universidad de El Salvador.
Asistente de modelos de entidades (Entity Data Model Wizard)
Tal y como hemos mencionado anteriormente, el asistente de modelos es el encargado de generar
el archivo edmx con el que trabaja el diseñador. Para ello, este asistente permite crear el modelo
a partir de una base de datos ya existente (la practica más habitual a aunque no la única).
Con el fin de mostrar el asistente mencionado realizaremos un sencillo ejemplo, en realidad, el
propósito del mismo es mas enseñarle y que conozca las herramientas que hablar de modelos
de entidades o las distintas posibilidades que EDM nos ofrece. Para el ejemplo, partiremos, de
una base de datos con el esquema relacional que se puede ver en la figura siguiente:
Figura 4. Diagrama relacional del ejemplo
En un proyecto cualquiera de Visual Studio (un ejemplo de aplicación de consola le podrá valer
para descubrir las herramientas con las que trabajaremos), agregamos un nuevo elemento de
tipo ADO.NET Entity Data Model, Figura 5. Una vez hecho esto, el asistente nos permitir
seleccionar la base de datos a partir de la cual crearemos nuestro modelo conceptual, figuras 6 y
7.
Página 10
Universidad de El Salvador.
Figura 5. Agregando un modelo de EDM
Figura 6. Asistente de creación del modelo conceptual
Página 11
Universidad de El Salvador.
Figura 7. Asistente de creación del modelo conceptual (2)
Para terminar, seleccionaremos los elementos de la base de datos que queramos que formen
parte de nuestro modelo conceptual. En nuestro caso, simplemente ponemos las tablas de
Customer y Order, como vemos en la Figura 8:
Página 12
Universidad de El Salvador.
Una vez que hemos terminado de crear el modelo conceptual, ya podremos ver el archivo
edmx dentro del proyecto, y el diseñador de entidades se abrir cada vez que este archivo sea
seleccionado. Si desea ver las distintas secciones de metadatos del archivo (recuerde: las
secciones SSDL,CSDL y MSL), puede seleccionar el archivo del modelo EDM, seleccionar la
opción “Abrir con” su menú contextual y elegir el editor de XML. Verá como ahora en vez del
diseñador se muestra un archivo XML con las distintas secciones de metadatos (figuras 9 y 10).
Figura 9. Selección de un editor para un archivo EDMX.
Figura 10. Vista XML de un archivo EDMX.
Página 13
Universidad de El Salvador.
Asistente de actualización de modelos.
Esta herramienta se utiliza para actualizar el modelo EDM después de que se hayan realizado
cambios en la base de datos con la que estemos trabajando. Para usar esta herramienta, basta con
situarse en el Navegador del modelo y seleccionar de su menú contextual la opción actualizar
modelo desde la base de datos. El asistente de actualización de modelos pone a nuestra
disposición tres pestañas de trabajo:
Opción Descripción Agregar Permite incorporar al modelo nuevos
elementos del esquema de la base de datos.
Refrescar Muestra los elementos actuales en el modelo y permite seleccionar aquellos cuya definición queramos refrescar o
actualizar.
Eliminar Muestra los elementos actuales en el modelo y permite seleccionar cuales no deseamos que pertenezcan a l.
Tabla 3. Tabla de actualización de modelos.
A continuación se muestra un sencillo ejemplo del uso del asistente de actualización de un modelo
EDM. Lo único que se hará es agregar una nueva columna a la tabla Customer con el fin de
especificar su número de pasaporte, PassportNumber. Una vez agregada la columna en el modelo
relacional con el que estamos trabajando, seleccionaremos la ventana de navegación del
modelo y haremos clic en la opción de actualización del modelo conceptual que tenemos en su
menú contextual.
Figura 11. Actualización del modelo.
Página 14
Universidad de El Salvador.
El asistente de actualización nos mostrara las tres opciones de la tabla anterior; en nuestro caso,
seleccionaremos la opción Refrescar el modelò (figura 12).
Figura 12. Refrescando un modelo de EDM.
Una vez que el asistente haya terminado su trabajo, en este caso agregar una nueva
propiedad a la entidad Customer, podremos ver como el diseñador nos actualiza la información
(figura 13).
Figura 13. Entidad después de actualizar.
Página 15
Universidad de El Salvador.
Una vez que se produce la actualización de un modelo, se sobrescribe la sección SSDL del
fichero edmx correspondiente, por lo que si previamente hubiéramos realizado cualquier
modificación sobre él, tales cambios se perderán y no se verán reflejados en el nuevo modelo.
Sobre las secciones CSDL y MSL el asistente de actualizaciones solamente permite agregar
elementos. Por ello cuando se eliminen tablas y/o asociaciones de la base de datos
subyacente, estas seguirán presentes en el modelo EDM y deber ser usted manualmente quien
los elimine. En la siguiente tabla se puede ver una lista de los cambios que se producen en los
modelos EDM en función de las secciones realizadas en la base de datos subyacente.
Página 16
Universidad de El Salvador.
Tabla 4. Cambios en el modelo en función de las acciones.
EDMGen o Generador de EDM
Por último, EDMGen.exe es una herramienta de línea de comandos usada para trabajar con
modelos EDM. Los principales usos que se le pueden dar a EdmGen son los siguientes:
• Conectar con una fuente de datos usando un proveedor específico de ADO.NET Entity
Framework y generar las secciones SSDL, CSDL y MSL de EDM.
• Validar un modelo existente.
• Producir código fuente a partir de la sección CSDL.
Por defecto, EdmGen se sitúa en el directorio de la instalación de .NET Framework 4.0, por lo que
es accesible directamente desde la ventana de comandos de Visual Studio 2010. Aunque podrá
pensarse que en la mayora de los casos esta herramienta no va ser utilizada puesto que la
tenemos perfectamente integrada dentro del entorno de desarrollo (Visual Studio 2010), es
necesario conocer su existencia y posibles usos, pues podrá ser conveniente utilizarla en algún
proceso avanzado de generación automática de código basado en modelos de entidades. En la
siguiente tabla se muestra una lista de los diferentes modos de trabajo que ofrece EdmGen.
Tabla 5. Modos de trabajo de EdmGen.
Página 17
Universidad de El Salvador.
Entity Client Entity Client (o EntityClient, unido, nombre con una connotación más cercana al código) es sin
duda alguna, junto a EDM, uno de los elementos centrales dentro de ADO.NET Entity Framework.
Como seguramente sabremos, desde la versión 2.0 de .NET disponemos de jerarquías de clases
que engloban bajo un mismo “paraguas de herencias” clases necesarias para trabajar con los
proveedores específicos para cada motor de base de datos, como SqlClient u OracleClient. Entity
Client representa un nuevo conjunto de clases que se integran armónicamente dentro de esas
jerarquías .
Figura 14. Jerarquía de clases DbConnection.
Entity Client es un nuevo proveedor de ADO.NET cuya principal diferencia con el resto de
proveedores radica en que, a diferencia de los proveedores tradicionales que trabajan con los
modelos físicos de sus bases de datos, con Entity Client consultaremos los modelos de EDM, por lo
que aprovecharemos en todo momento el agnosticismo de la base de datos subyacente. Entity
Client implementa también a su nivel una arquitectura abierta, y es capaz de trabajar con
diferentes proveedores de Entity Frame específicos, que son quienes se encargan de traducir las
consultas sobre el modelo en consultas en el dialecto especifico de la base de datos subyacente,
así como de la ejecución de dichas consultas y la recuperación de los resultados (para lo que
probablemente se apoyen en otros proveedores de ADO.NET).
El lenguaje que se utiliza para consultar los modelos de EDM se llama Entity SQL (abreviadamente,
eSQL), y es una variante de los dialectos SQL tradicionales que mejora algunas aspectos de las
consultas, como las navegaciones entre tablas.
Página 18
Universidad de El Salvador.
Object Services. Acabamos de ver como con Entity Client y eSQL realmente podemos cubrir la mayora de las
necesidades de una capa de acceso a datos. Sin embargo, este modelo es el mismo del que
dispongamos hasta este momento: por supuesto, con las ventajas de la consulta de modelos
conceptuales y el trabajo con múltiples bases de datos. Pero seguiremos sufriendo el trabajo de la
recuperación de los resultados obtenidos de la capa de datos para transformarlos en objetos de
las distintas clases que tengamos en el conjunto de clases que confirman nuestro dominio del
problema (proceso que se conoce como materialización). Para salvar este desajuste, Entity
Frame ofrece Object Services, un conjunto de clases que, entre otras facilidades, nos permiten
obtener directamente objetos materializados a partir de las consultas eSQL que ejecutemos.
Al mismo tiempo que disponemos de una materialización automática de los resultados,
ganaremos también todas las ayudas que el compilador y el entorno integrado pueden ofrecernos,
al estar trabajando en todo momento de una forma fuertemente tipada.
En contraposición al ejemplo del punto anterior, en el que se consultaban datos de un modelo
conceptual usando Entity Client, a continuación podremos ver cómo obtener esos mismos datos
usando Object Services y materializando de forma automática los resultados.
LINQ To Entities, L2E Llegados a este punto, ya hemos visto varias de las múltiples ventajas que nos ofrece Entity Frame,
incluyendo la posibilidad de realizar consultas sobre modelos conceptuales y la materialización
automática de objetos a partir de los resultad os de esas consultas. Sin embargo, si
preguntásemos a programadores de aplicaciones centradas en datos cual es la mayor fuente de
errores que sufren durante sus horas de desarrollo, es casi seguro que uno de los elementos que
mencionaran serán los errores en la escritura de las consultas que crean. Puesto que estas
consultas para el compilador no son más que meras secuencias de caracteres, este no podrá
validarlas ni ayudarnos en la codificación de las mismas, de forma que, aun cuando una consulta
no esté bien formada o sea incorrecta, podremos compilar y ejecutar, quedando la detección de
posibles errores para tiempo de ejecución. La llegada de LINQ abría una vía increíble para salvar
este inconveniente, sentando las bases para la utilización directa de consultas integradas e
nuestro lenguaje de programación. Y por supuesto, Microsoft no podrá sacar a la luz una nueva
tecnología de acceso a datos sin que ésta estuviera “habilitada para LINQ”. El sabor de LINQ que
hace posible las consultas integradas sobre los modelos de entidades se llama precisamente LINQ
to Entities (L2E), y ha sido construido sobre la base de Object Services.
Página 19
Universidad de El Salvador.
Dando vida a los modelos
Un enfoque de diseño habitual para crear una aplicación o un servicio consiste en dividir la
aplicación o el servicio en tres partes: un modelo de dominio, un modelo lógico y un modelo físico.
El modelo de dominio define las entidades y relaciones del sistema que se está modelando. El
modelo lógico de una base de datos relacional normaliza las entidades y relaciones en tablas con
restricciones de claves externas. El modelo físico abarca las capacidades de un motor de datos
determinado especificando los detalles del almacenamiento en forma de particiones e índices.
Los administradores de bases de datos refinan el modelo físico para mejorar el rendimiento, pero
los programadores que escriben el código de la aplicación principalmente se limitan a trabajar con
el modelo lógico escribiendo consultas SQL y llamando a procedimientos almacenados. Los
modelos de dominio se suelen usar como una herramienta para capturar y comunicar los
requisitos de una aplicación, con frecuencia como diagramas inertes que se ven y se explican en
las primeras etapas de un proyecto, y a continuación se abandonan. Muchos equipos de
desarrolladores omiten la creación de un modelo conceptual y comienzan especificando las tablas,
columnas y claves en una base de datos relacional.
Entity Framework da vida a los modelos conceptuales permitiendo a los programadores consultar
las entidades y relaciones en el modelo de dominio (denominado modelo conceptual en Entity
Framework ) al tiempo que se basan en Entity Framework para traducir esas operaciones en los
comandos específicos del origen de datos. Esto libera a las aplicaciones de las dependencias
codificadas de forma rígida en un origen de datos determinado. El modelo conceptual, el modelo
de almacenamiento y las asignaciones entre los dos se expresan en esquemas basados en XML y
se definen en archivos que tienen extensiones de nombre correspondientes:
• El lenguaje de definición de esquemas conceptuales (CSDL) define el modelo conceptual.
CSDL es la implementación de Entity Framework del Entity Data Model. La extensión de
archivo es .csdl.
• El lenguaje de definición de esquemas de almacenamiento (SSDL) define el modelo de
almacenamiento, que también se denomina modelo lógico. La extensión de archivo es
.ssdl.
• El lenguaje de especificación de asignaciones (MSL) define las asignaciones entre los
modelos conceptual y de almacenamiento. La extensión de archivo es .msl.
El modelo de almacenamiento y las asignaciones pueden cambiar según sea necesario sin requerir
cambios en el modelo conceptual, las clases de datos o el código de la aplicación. Dado que los
modelos de almacenamiento son específicos del proveedor, puede trabajar con un modelo
conceptual coherente a través de varios orígenes de datos.
Página 20
Universidad de El Salvador.
Entity Framework utiliza estos modelos y archivos de asignación para transformar las operaciones
de creación, lectura, actualización y eliminación de las entidades y relaciones del modelo
conceptual en las operaciones equivalentes en el origen de datos. Entity Framework incluso
permite asignar las entidades del modelo conceptual a los procedimientos almacenados en el
origen de datos.
Generación de modelos.
Las aplicaciones y servicios de Entity Framework se basan en información de modelos y
asignaciones que se expresa en tres lenguajes basados en XML:
1. Lenguaje de definición de esquemas conceptuales (CSDL)
El lenguaje de definición de esquemas conceptuales (CSDL) es un lenguaje basado en XML
que describe las entidades, las relaciones y las funciones que conforman un modelo
conceptual de una aplicación controlada por datos. Entity Framework y ADO.NET Data
Services pueden usar este modelo conceptual. Entity Framework usa los metadatos
descritos mediante CSDL para asignar entidades y relaciones definidas en un modelo
conceptual a un origen de datos. Para obtener más información, vea Especificación SSDL y
Especificación MSL.
CSDL es la implementación de Entity Framework de Entity Data Model.
En una aplicación de Entity Framework , los datos del modelo conceptual se cargan desde
un archivo .csdl (escrito en CSDL) en una instancia de la clase
System.Data.Metadata.Edm.EdmItemCollection, y se puede obtener acceso a ellos usando
métodos de la clase System.Data.Metadata.Edm.MetadataWorkspace. Entity Framework
usa los datos del modelo conceptual para convertir las consultas realizadas en dicho
modelo en comandos específicos del origen de datos.
2. Lenguaje de definición de esquemas de almacenamiento (SSDL)
El lenguaje de definición de esquemas de almacenamiento (SSDL) es un lenguaje basado
en XML que describe el modelo de almacenamiento de una aplicación Entity Framework.
En una aplicación de Entity Framework, los metadatos del modelo de almacenamiento se
cargan desde un archivo .ssdl (escrito en SSDL) en una instancia de
System.Data.Metadata.Edm.StoreItemCollection y son accesibles a través de métodos de
la clase System.Data.Metadata.Edm.MetadataWorkspace. Entity Framework usa los
Página 21
Universidad de El Salvador.
metadatos del modelo de almacenamiento para convertir las consultas realizadas sobre el
modelo conceptual en comandos específicos del almacenamiento.
3. Lenguaje de especificación de asignaciones (MSL)
El lenguaje de especificación de asignaciones (MSL) es un lenguaje basado en XML que
describe la asignación entre el modelo conceptual y el modelo de almacenamiento de una
aplicación de Entity Framework .
En una aplicación de Entity Framework , los metadatos de asignación se cargan desde un
archivo .msl (escrito en MSL) en tiempo de compilación. Entity Framework usa los
metadatos de asignación en tiempo de ejecución para convertir las consultas realizadas
contra el modelo conceptual en comandos específicos del almacenamiento.
Asignar objetos a datos
La programación orientada a objetos supone un desafío al interactuar con sistemas de
almacenamiento de datos. Aunque la organización de clases suele reflejar la organización de las
tablas de bases de datos relacionales, el ajuste no es perfecto. Varias tablas normalizadas suelen
corresponder a una sola clase y las relaciones entre las clases se representan a menudo de forma
diferente a las relaciones entre tablas. Por ejemplo, para representar el cliente de un pedido de
ventas, una clase Order podría utilizar una propiedad que contiene una referencia a una instancia
de una clase Customer, mientras que una fila de la tabla Order en una base de datos contiene una
columna de clave externa con un valor que corresponde a un valor de clave principal en la tabla
Customer (o conjunto de columnas). Una clase Customer podría tener una propiedad denominada
Orders que contuviera una colección de instancias de la clase Order, mientras que la tabla
Customer en una base de datos no tiene ninguna columna comparable. Entity Framework
proporciona a los desarrolladores de software la flexibilidad para representar las relaciones de
esta manera, o para modelar más estrechamente las relaciones tal como se representan en la base
de datos. Para obtener más información, vea Definir y administrar relaciones (Entity Framework).
Las soluciones existentes han intentado cubrir este hueco, que se suele denominar "desigualdad
de impedancia", asignando únicamente clases y propiedades orientadas a objetos a las tablas y
columnas relacionales. En lugar de seguir este enfoque tradicional, Entity Framework asigna las
tablas relacionales, columnas y restricciones FOREIGN KEY de los modelos lógicos a las entidades y
relaciones de los modelos conceptuales. Esto permite una mayor flexibilidad al definir los objetos
y optimizar el modelo lógico. Las herramientas de Entity Data Model generan clases de datos
extensibles según el modelo conceptual. Se trata de clases parciales que se pueden extender con
miembros adicionales que el programador agrega. De forma predeterminada, las clases que se
generan para un modelo conceptual determinado derivan de las clases base que proporcionan
Página 22
Universidad de El Salvador.
servicios para materializar las entidades como objetos y para realizar un seguimiento de los
cambios y guardarlos. Los desarrolladores pueden utilizar estas clases para trabajar con las
entidades y relaciones como objetos relacionados mediante asociaciones. Los desarrolladores
también pueden personalizar las clases que se generan para un modelo conceptual.
Obtener acceso a los datos de entidad
y cambiarlos
Como algo más que otra solución de asignación objeto-relacional, Entity Framework trata
fundamentalmente de permitir que las aplicaciones obtengan acceso y cambien los datos que
están representados como entidades y relaciones en el modelo conceptual. Entity Framework usa
la información de los archivos del modelo y de asignación para traducir las consultas de objeto con
los tipos de entidad que se representan en el modelo conceptual en consultas específicas del
origen de datos. Los resultados de la consulta se materializan en objetos que Entity Framework
administra. Entity Framework proporciona las maneras siguientes de consultar un modelo
conceptual y devolver objetos:
• LINQ to Entities. Proporciona compatibilidad con Language-Integrated Query (LINQ) para
consultar los tipos de entidad que se definen en un modelo conceptual.
• Entity SQL. Un dialecto de SQL, independiente del almacenamiento, que trabaja
directamente con entidades del modelo conceptual y que admite conceptos de Entity Data
Model . Entity SQL se utiliza tanto con consultas de objeto como con consultas que se
ejecutan utilizando el proveedor EntityClient.
• Métodos del generador de consultas. Estos métodos permiten construir consultas de
Entity SQL utilizando métodos de consulta del estilo de LINQ.
El Entity Framework incluye el proveedor de datos de EntityClient. Este proveedor administra las
conexiones, traduce las consultas de entidad en consultas específicas del origen de datos y
devuelve un lector de datos que Entity Framework usa para materializar los datos de la entidad en
los objetos.
Página 23
Universidad de El Salvador.
Cuando no se requiere la materialización de los objetos, el proveedor de EntityClient también se
puede utilizar como un proveedor de datos ADO.NET estándar habilitando las aplicaciones para
ejecutar consultas Entity SQL y usar el lector de datos de solo lectura devuelto.
El diagrama siguiente muestra la arquitectura de Entity Framework para el acceso a datos:
Las herramientas de Entity Data Model pueden generar una clase derivada de ObjectContext que
representa el contenedor de entidades definido en el modelo conceptual. Este contexto del objeto
proporciona los medios para realizar el seguimiento de los cambios y administrar las identidades,
la simultaneidad y las relaciones.
Esta clase también expone un método SaveChanges que escribe las inserciones, actualizaciones y
eliminaciones en el origen de datos. Al igual que las consultas, estas modificaciones son realizadas
bien por los comandos que el sistema genera automáticamente o bien por los procedimientos
almacenados que el programador especifica. Para obtener más información, vea Crear, agregar,
modificar y eliminar objetos (Entity Framework).
Página 24
Universidad de El Salvador.
Proveedores de datos
El proveedor EntityClient extiende el modelo de proveedor de ADO.NET teniendo acceso a los
datos en lo que respecta a las entidades conceptuales y relaciones. Ejecuta consultas que utilizan
Entity SQL . Entity SQL proporciona el lenguaje de consultas subyacente que permite a EntityClient
comunicarse con la base de datos.
Entity Framework incluye un proveedor de datos SqlClient actualizado que admite los árboles de
comandos canónicos.
Herramientas de Entity Data Model
Junto con el motor de ejecución de Entity Framework , .NET Framework versión 4 incluye el
Generador de EDM (EdmGen.exe). Esta utilidad de línea de comandos se conecta a un origen de
datos y genera archivos del modelo y de asignación basados en una asignación unívoca entre las
entidades y las tablas. También usa un archivo de modelo conceptual (.csdl) para generar un
archivo de nivel de objeto que contiene clases que representan tipos de entidad y ObjectContext.
Visual Studio 2010 incluye una variada compatibilidad con las herramientas que permiten generar
y mantener archivos de modelo y de asignación en una aplicación de Visual Studio. El Entity Data
Model Designer permite crear escenarios de asignación avanzados, por ejemplo de la herencia de
tabla por tipo y de tabla por jerarquía, y entidades de división que se asignan a varias tablas.
Asignar un modelo conceptual a un
modelo de almacenamiento
Entity Framework usa un modelo conceptual para proporcionar una vista de los datos centrada en
objetos, expresados como tipos de entidad y asociaciones. Los desarrolladores de aplicaciones
solo tienen que dedicarse a programar con las clases generadas a partir del modelo conceptual, en
lugar de tener que pensar también en el esquema de almacenamiento y en la forma de obtener
acceso a los objetos del almacén de datos y transformarlos en objetos de programación.
Entity Framework usa un modelo conceptual, un modelo de almacenamiento y la asignación entre
ambos modelos para transformar las operaciones de creación, lectura, actualización y eliminación
de las entidades en las operaciones equivalentes en el origen de datos.
Página 25
Universidad de El Salvador.
Modelo conceptual
El modelo conceptual para una aplicación expresa entidades y relaciones en el lenguaje de
definición de esquemas conceptuales (CSDL), que es una implementación de Entity Data Model.
CSDL es un lenguaje basado en XML. Cada uno de los tipos de entidad definidos en CSDL tiene un
nombre, una clave para identificar de forma única las instancias, y un conjunto de propiedades.
Los tipos de datos asignados a propiedades se especifican como tipos simples, que son
propiedades escalares, o como tipos complejos, que son tipos que están compuestos de una o más
propiedades escalares o complejas.
Los atributos XML también pueden especificar la posibilidad de aceptar NULL o asignar un valor
predeterminado. Las asociaciones definen las relaciones entre las entidades. Los elementos y la
terminología del lenguaje Entity Framework se explican con más detalle en Terminología de Entity
Framework.
El fragmento XML siguiente representa parte del modelo conceptual School (basado en la base de
datos de ejemplo School). En el ejemplo se muestran los tipos de entidad Department y Course
que están relacionados por la asociación FK_Course_Department; las demás entidades y
asociaciones se han quitado:
<Schema Namespace="SchoolModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/ 2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/ 09/edm"> <EntityContainer Name="SchoolEntities"> <EntitySet Name="Courses" EntityType="SchoolMode l.Course" /> <EntitySet Name="Departments" EntityType="School Model.Department" /> <AssociationSet Name="FK_Course_Department" Association="SchoolModel.FK_Cours e_Department"> <End Role="Department" EntitySet="Depar tments" /> <End Role="Course" EntitySet="Courses" /> </AssociationSet> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="Int32" Nulla ble="false" /> <Property Name="Title" Type="String" Nullabl e="false" MaxLength="100" Unicode="true" Fix edLength="false" /> <Property Name="Credits" Type="Int32" Nullab le="false" /> <Property Name="DepartmentID" Type="Int32" N ullable="false" /> <NavigationProperty Name="Department" Relationship="SchoolModel.FK _Course_Department" FromRole="Course" ToRole="De partment" /> </EntityType>
Página 26
Universidad de El Salvador.
<EntityType Name="Department"> <Key> <PropertyRef Name="DepartmentID" /> </Key> <Property Name="DepartmentID" Type="Int32" N ullable="false" /> <Property Name="Name" Type="String" Nullable ="false" MaxLength="50" Unicode="true" Fixe dLength="false" /> <Property Name="Budget" Type="Decimal" Nulla ble="false" Precision="19" Scale="4" /> <Property Name="StartDate" Type="DateTime" N ullable="false" /> <Property Name="Administrator" Type="Int32" /> <NavigationProperty Name="Courses" Relationship="SchoolModel.FK _Course_Department" FromRole="Department" ToRole ="Course" /> </EntityType> <Association Name="FK_Course_Department"> <End Role="Department" Type="SchoolModel.Depart ment" Multiplicity="1" /> <End Role="Course" Type="SchoolModel.Course" Mu ltiplicity="*" /> <ReferentialConstraint> <Principal Role="Department"> <PropertyRef Name="DepartmentID" /> </Principal> <Dependent Role="Course"> <PropertyRef Name="DepartmentID" /> </Dependent> </ReferentialConstraint> </Association> </Schema>
Modelo de almacenamiento
El modelo de almacenamiento se describe mediante el lenguaje de definición de esquemas de
almacenamiento (SSDL). Los tipos de datos de las propiedades declaradas en SSDL son los del
modelo de almacenamiento.
Este fragmento de modelo de almacenamiento muestra un ejemplo de metadatos de
almacenamiento para las tablas Course y Department de la base de datos School que están
relacionadas por la clave externa FK_Course_Department; las demás entidades y asociaciones se
han quitado:
<Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderMa nifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/ 12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009 /02/edm/ssdl">
Página 27
Universidad de El Salvador.
<EntityContainer Name="SchoolModelStoreContainer" > <EntitySet Name="Course" EntityType="SchoolModel .Store.Course" store:Type="Tables" Schema="dbo" /> <EntitySet Name="Department" EntityType="SchoolModel.Store.Departm ent" store:Type="Tables" Schema="dbo" /> <AssociationSet Name="FK_Course_Department" Association="SchoolModel.Store.FK _Course_Department"> <End Role="Department" EntitySet="Depar tment" /> <End Role="Course" EntitySet="Course" / > </AssociationSet> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullabl e="false" /> <Property Name="Title" Type="nvarchar" Nulla ble="false" MaxLength="100" /> <Property Name="Credits" Type="int" Nullable ="false" /> <Property Name="DepartmentID" Type="int" Nul lable="false" /> </EntityType> <EntityType Name="Department"> <Key> <PropertyRef Name="DepartmentID" /> </Key> <Property Name="DepartmentID" Type="int" Nul lable="false" /> <Property Name="Name" Type="nvarchar" Nullab le="false" MaxLength="50" /> <Property Name="Budget" Type="money" Nullabl e="false" /> <Property Name="StartDate" Type="datetime" N ullable="false" /> <Property Name="Administrator" Type="int" /> </EntityType> <Association Name="FK_Course_Department"> <End Role="Department" Type="SchoolModel.Sto re.Department" Multiplicity="1" /> <End Role="Course" Type="SchoolModel.Store.C ourse" Multiplicity="*" /> <ReferentialConstraint> <Principal Role="Department"> <PropertyRef Name="DepartmentID" /> </Principal> <Dependent Role="Course"> <PropertyRef Name="DepartmentID" /> </Dependent> </ReferentialConstraint> </Association> </Schema>
Página 28
Universidad de El Salvador.
Especificación de asignaciones
Una especificación de asignaciones usa el lenguaje de especificación de asignaciones (MSL) para
asignar el modelo conceptual al modelo de almacenamiento.
El siguiente fragmento de MSL muestra una asignación unívoca entre los modelos conceptual y
de almacenamiento para las entidades Department y Course del modelo School:
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2 008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="SchoolMode lStoreContainer" CdmEntityContainer="SchoolEntities "> <EntitySetMapping Name="Courses"> <EntityTypeMapping TypeName="SchoolModel.Cours e"> <MappingFragment StoreEntitySet="Course"> <ScalarProperty Name="CourseID" ColumnName=" CourseID" /> <ScalarProperty Name="Title" ColumnName="Tit le" /> <ScalarProperty Name="Credits" ColumnName="C redits" /> <ScalarProperty Name="DepartmentID" ColumnNa me="DepartmentID" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> <EntitySetMapping Name="Departments"> <EntityTypeMapping TypeName="SchoolModel.Depar tment"> <MappingFragment StoreEntitySet="Department"> <ScalarProperty Name="DepartmentID" ColumnNa me="DepartmentID" /> <ScalarProperty Name="Name" ColumnName="Name " /> <ScalarProperty Name="Budget" ColumnName="Bu dget" /> <ScalarProperty Name="StartDate" ColumnName= "StartDate" /> <ScalarProperty Name="Administrator" ColumnName="Administrator" / > </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping>
Trabajando con datos de entidad.
Entity Framework compila metadatos de un modelo conceptual y un modelo de almacenamiento,
junto con las asignaciones entre esos modelos, en pares bidireccionales de instrucciones Entity
SQL con la denominación vistas de cliente. Estas vistas controlan el procesamiento de consultas y
actualizaciones en el motor en tiempo de ejecución. El compilador de asignaciones que genera las
Página 29
Universidad de El Salvador.
vistas se puede invocar en tiempo de diseño o en tiempo de ejecución cuando la primera consulta
se ejecuta contra un modelo conceptual.
Entity Framework se basa en proveedores de datos ADO.NET específicos del almacenamiento
proporcionando un objeto EntityConnection a un proveedor de datos y un origen de datos
subyacentes.
Cuando se ejecuta una consulta, se analiza y se convierte en un árbol de comandos canónico, que
es una representación del modelo de objetos de la consulta. Los árboles de comandos canónicos
representan comandos SELECT, UPDATE, INSERT y DELETE. La totalidad del procesamiento
subsiguiente se realiza en el árbol de comandos, que es el medio de comunicación entre el
proveedor de System.Data.EntityClient y el proveedor de datos de .NET Framework subyacente,
como System.Data.SqlClient.
Consultar objetos
Las Herramientas de Entity Data Model de ADO.NET generan una clase derivada de ObjectContext
que representa el contenedor de entidades que se define en el modelo conceptual. La clase
ObjectContext admite consultas contra un modelo conceptual que devuelve entidades como
objetos, así como la creación, actualización y eliminación de objetos entidad. Entity Framework
admite consultas de objeto contra un modelo conceptual. Las consultas se pueden crear utilizando
métodos del generador de consultas de objeto, Language-Integrated Query (LINQ) y Entity SQL .
En un modelo conceptual, las entidades se relacionan entre sí mediante asociaciones. En la capa
de objeto, estas asociaciones están representadas por propiedades que exponen colecciones de
objetos relacionados de acuerdo con una referencia de entidad. Por ejemplo, en el modelo School,
Department.Course obtiene una colección de entidad de objetos Course basada en la asociación
entre Course y Department. Si la propiedad LazyLoadingEnabled de la clase ObjectContext tiene el
valor false, los objetos a los que se hace referencia no se cargan automáticamente, y se debe
llamar al método Load de la referencia de entidad para cargar los datos de los objetos
relacionados en el contexto de los objetos.
También puede especificar la ruta de una consulta que defina qué objetos relacionados se han de
cargar con los objetos devueltos. Para obtener más información, vea Consultar un modelo
conceptual (Entity Framework).
En el ejemplo siguiente se muestra una consulta que, cuando se ejecuta, recupera todos los
objetos Department. Una definición de la ruta de una consulta garantiza que también se
devuelvan los objetos Course relacionados con los objetos Department. Una cláusula ORDER BY de
Entity SQL ordena los objetos devueltos por Name:
// Define a query that returns all Department // objects and course objects, ordered by name.
Página 30
Universidad de El Salvador.
var departmentQuery = from d in schoolContext.Departments.Include( "Courses" ) orderby d.Name select d;
Trabajar con objetos
Un objeto en un contexto del objeto es una representación de tipo de entidad de datos en el
origen de datos. Puede modificar, crear y eliminar objetos en un contexto del objeto. El contexto
del objeto administra las identidades y relaciones entre objetos. También puede serializar objetos
y enlazarlos a controles. Para obtener más información, vea Trabajar con objetos (Entity
Framework).
En el ejemplo siguiente obtenemos una colección de objetos Course relacionados con un objeto
Department y se enlaza la colección a un control DataGridView:
//Get the object for the selected department. Department department = (Department) this .departmentList.SelectedItem; //Bind the grid view to the collection of Course ob jects // that are related to the selected Department obje ct. courseGridView.DataSource = department.Courses;
Entity Framework realiza el seguimiento de los cambios en los datos de entidad y permite
conservar los cambios en el origen de datos.
Página 31
Universidad de El Salvador.
Ejemplo utilizado.
Los ejemplo utilizados a lo largo de este documento se refieren a una base de datos de ejemplo
denominada School. La base de datos School contiene las tablas siguientes que podrán observarse
en el siguiente diagrama de bases de datos de sql:
Esta base de datos de ejemplo resalta muchos de los escenarios de modelos complejos admitidos
por las herramientas de Entity Data Model. El script crea las relaciones entre las tablas e inserta
datos de ejemplo para que pueda ejecutar los ejemplos y ver cómo trabajan. A continuación se
muestra el modelo School mostrado en el ADO.NET Entity Data Model Designer:
Página 32
Universidad de El Salvador.
Para el ejemplo hemos utilizado 2 formularios, uno al que llamaremos “Visor del Curso” e
“Información”. A continuación se describen cada uno de ellos de forma individual, junto con su
codificación respectiva. Puede consultar también el demo adjunto a este documento, que
contiene este ejemplo descrito a continuación, para su respectiva prueba.
Formulario 1.
Figura 1. Captura de la interfaz de nuestro formulario “visor del curso”
Página 33
Universidad de El Salvador.
Código del formulario 1.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data; using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using System.Data.Objects;
using System.Data.Objects.DataClasses;
namespace CourseManager
{
public partial class CourseViewer : Form
{
private SchoolEntities schoolContext;
public CourseViewer()
{
InitializeComponent();
}
private void closeForm_Click(object sender, EventArgs e)
{
this.Close();
schoolContext.Dispose();
}
private void CourseViewer_Load(object sender, EventArgs e)
{
//creamos el objecto ObjectContext
schoolContext = new SchoolEntities();
// se define una consulta que devuelva todos los objetos departments y
// los objetos course ordenados por su nombre
var departmentQuery = from d in
schoolContext.Departments.Include("Courses")
orderby d.Name
select d;
try
{
// enlazamos el ComboBox a la consulta,
// la cual se ejecuta durante el enlace a los datos.
//Para evitar que la consulta se ejecute varias veces durante el
// enlace con los datos, se recomienda enlazar los controles con // el resultado del metodo excute.
this.departmentList.DisplayMember = "Name";
this.departmentList.DataSource =
((ObjectQuery)departmentQuery).Execute(MergeOption.AppendOnly); }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
Página 34
Universidad de El Salvador.
}
}
private void departmentList_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
//obtenemos el objeto para el departamnt selecionado.
Department department = (Department)this.departmentList.SelectedItem;
//agregamosa al gridview la coleccion de objetos course // que estan relacionados con el objecto department selecionado
courseGridView.DataSource = department.Courses;
courseGridView.Columns["Department"].Visible = false;
courseGridView.Columns["StudentGrades"].Visible = false;
courseGridView.Columns["OnlineCourse"].Visible = false;
courseGridView.Columns["OnsiteCourse"].Visible = false;
courseGridView.Columns["People"].Visible = false;
courseGridView.Columns["DepartmentId"].Visible = false;
courseGridView.AllowUserToDeleteRows = false;
courseGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
}
catch (Exception ex)
{ MessageBox.Show(ex.Message);
}
}
private void saveChanges_Click(object sender, EventArgs e) {
try
{
// guardamo los cambios en los objectos de la base de datos
// y desplegamos un msg mostrando que el formulario se actualizo
schoolContext.SaveChanges();
MessageBox.Show("los cambios han sido guardados en la bd.");
this.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void butinformation_Click(object sender, EventArgs e)
{
informacion info = new informacion();
info.Show();
}
Página 35
Universidad de El Salvador.
private void button1_Click(object sender, EventArgs e)
{
var departmentQuery = from d in schoolContext.Departments.Include("Courses")
orderby d.Name
select d;
try
{
this.departmentList.DisplayMember = "Name";
this.departmentList.DataSource = ((ObjectQuery)departmentQuery).Execute(MergeOption.AppendOnly);
}
catch (Exception ex)
{ MessageBox.Show(ex.Message);
}
}
}
}
Página 36
Universidad de El Salvador.
Formulario 2.
Figura 2. Vista de nuestro Formulario “Información”
Código del formulario 2.
using System; using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using System.Data.Objects;
using System.Data.Objects.DataClasses;
Página 37
Universidad de El Salvador.
namespace CourseManager
{
public partial class informacion : Form
{ private SchoolEntities schoolContext;
public informacion()
{
InitializeComponent();
}
private void informacion_Load(object sender, EventArgs e)
{
schoolContext = new SchoolEntities(); var departmentQuery = from d in
schoolContext.Departments.Include("Courses")
orderby d.Name
select d;
try
{
this.departmentList.DisplayMember = "Name";
this.departmentList.DataSource =
((ObjectQuery)departmentQuery).Execute(MergeOption.AppendOnly);
this.comboDepartment.DisplayMember = "Name";
this.comboDepartment.DataSource =
((ObjectQuery)departmentQuery).Execute(MergeOption.AppendOnly);
}
catch (Exception ex)
{ MessageBox.Show(ex.Message);
}
}
private void butSave_Click(object sender, EventArgs e)
{ Department department = (Department)this.departmentList.SelectedItem;
Course objcourse = new Course();
objcourse.CourseID = (int)this.IDcurso.Value;
objcourse.Title = this.titulo.Text; objcourse.Credits =(int)this.creditos.Value;
objcourse.DepartmentID = department.DepartmentID;
schoolContext.Courses.AddObject(objcourse);
schoolContext.SaveChanges();
MessageBox.Show("Registro Guardado");
this.Refresh();
}
private void comboDepartment_SelectedIndexChanged(object sender, EventArgs
e)
{
try
{ Department department =
(Department)this.comboDepartment.SelectedItem;
courseGridView.DataSource = department.Courses;
Página 38
Universidad de El Salvador.
courseGridView.Columns["Department"].Visible = false;
courseGridView.Columns["StudentGrades"].Visible = false;
courseGridView.Columns["OnlineCourse"].Visible = false;
courseGridView.Columns["OnsiteCourse"].Visible = false; courseGridView.Columns["People"].Visible = false;
courseGridView.Columns["DepartmentId"].Visible = false;
courseGridView.AllowUserToDeleteRows = false;
courseGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); }
catch (Exception ex)
{ MessageBox.Show(ex.Message);
}
}
private void butborrar_Click(object sender, EventArgs e)
{
try
{
int id =
int.Parse(courseGridView.SelectedRows[0].Cells[0].Value.ToString());
schoolContext.BorrarCurso(id);
schoolContext.SaveChanges();
MessageBox.Show("Elemento borrado");
this.Refresh();
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
private void button1_Click(object sender, EventArgs e) {
var queryCourse = schoolContext.RecuperarCursos();
courseGridView.DataSource = queryCourse;
} }
}
Página 39
Universidad de El Salvador.
Nuestro modelo Entity luciría así:
Página 40
Universidad de El Salvador.
Script para crear la base de datos en SQL y el esquema.
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO USE [master]; GO IF EXISTS (SELECT * FROM sys.databases WHERE name = 'School') DROP DATABASE School; GO -- Create the School database. CREATE DATABASE School; GO -- Specify a simple recovery model -- to keep the log growth to a minimum. ALTER DATABASE School SET RECOVERY SIMPLE; GO USE School; GO -- Create the Department table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Department]' ) AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Department]( [DepartmentID] [int] NOT NULL, [Name] [nvarchar](50) NOT NULL, [Budget] [money] NOT NULL, [StartDate] [datetime] NOT NULL, [Administrator] [int] NULL, CONSTRAINT [PK_Department] PRIMARY KEY CLUSTERED ( [DepartmentID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the Person table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Person]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Person]( [PersonID] [int] IDENTITY(1,1) NOT NULL, [LastName] [nvarchar](50) NOT NULL, [FirstName] [nvarchar](50) NOT NULL, [HireDate] [datetime] NULL, [EnrollmentDate] [datetime] NULL,
Página 41
Universidad de El Salvador.
CONSTRAINT [PK_School.Student] PRIMARY KEY CLUSTER ED ( [PersonID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the OnsiteCourse table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OnsiteCourse ]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[OnsiteCourse]( [CourseID] [int] NOT NULL, [Location] [nvarchar](50) NOT NULL, [Days] [nvarchar](50) NOT NULL, [Time] [smalldatetime] NOT NULL, CONSTRAINT [PK_OnsiteCourse] PRIMARY KEY CLUSTERED ( [CourseID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the OnlineCourse table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OnlineCourse ]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[OnlineCourse]( [CourseID] [int] NOT NULL, [URL] [nvarchar](100) NOT NULL, CONSTRAINT [PK_OnlineCourse] PRIMARY KEY CLUSTERED ( [CourseID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO --Create the StudentGrade table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[StudentGrade ]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[StudentGrade]( [EnrollmentID] [int] IDENTITY(1,1) NOT NULL, [CourseID] [int] NOT NULL, [StudentID] [int] NOT NULL, [Grade] [decimal](3, 2) NULL, CONSTRAINT [PK_StudentGrade] PRIMARY KEY CLUSTERED ( [EnrollmentID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]
Página 42
Universidad de El Salvador.
END GO -- Create the CourseInstructor table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CourseInstru ctor]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[CourseInstructor]( [CourseID] [int] NOT NULL, [PersonID] [int] NOT NULL, CONSTRAINT [PK_CourseInstructor] PRIMARY KEY CLUST ERED ( [CourseID] ASC, [PersonID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the Course table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Course]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Course]( [CourseID] [int] NOT NULL, [Title] [nvarchar](100) NOT NULL, [Credits] [int] NOT NULL, [DepartmentID] [int] NOT NULL, CONSTRAINT [PK_School.Course] PRIMARY KEY CLUSTERE D ( [CourseID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the OfficeAssignment table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OfficeAssign ment]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[OfficeAssignment]( [InstructorID] [int] NOT NULL, [Location] [nvarchar](50) NOT NULL, [Timestamp] [timestamp] NOT NULL, CONSTRAINT [PK_OfficeAssignment] PRIMARY KEY CLUST ERED ( [InstructorID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Define the relationship between OnsiteCourse and Course. IF NOT EXISTS (SELECT * FROM sys.foreign_keys
Página 43
Universidad de El Salvador.
WHERE object_id = OBJECT_ID(N'[dbo].[FK_OnsiteCourse_Course]') AND parent_object_id = OBJECT_ID(N'[dbo].[On siteCourse]')) ALTER TABLE [dbo].[OnsiteCourse] WITH CHECK ADD CONSTRAINT [FK_OnsiteCourse_Course] FOREIGN KEY([CourseID]) REFERENCES [dbo].[Course] ([CourseID]) GO ALTER TABLE [dbo].[OnsiteCourse] CHECK CONSTRAINT [FK_OnsiteCourse_Course] GO -- Define the relationship between OnlineCourse and Course. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_OnlineCourse_Course]') AND parent_object_id = OBJECT_ID(N'[dbo].[On lineCourse]')) ALTER TABLE [dbo].[OnlineCourse] WITH CHECK ADD CONSTRAINT [FK_OnlineCourse_Course] FOREIGN KEY([CourseID]) REFERENCES [dbo].[Course] ([CourseID]) GO ALTER TABLE [dbo].[OnlineCourse] CHECK CONSTRAINT [FK_OnlineCourse_Course] GO -- Define the relationship between StudentGrade and Course. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_StudentGrade_Course]') AND parent_object_id = OBJECT_ID(N'[dbo].[St udentGrade]')) ALTER TABLE [dbo].[StudentGrade] WITH CHECK ADD CONSTRAINT [FK_StudentGrade_Course] FOREIGN KEY([CourseID]) REFERENCES [dbo].[Course] ([CourseID]) GO ALTER TABLE [dbo].[StudentGrade] CHECK CONSTRAINT [FK_StudentGrade_Course] GO --Define the relationship between StudentGrade and Student. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_StudentGrade_Student]') AND parent_object_id = OBJECT_ID(N'[dbo].[St udentGrade]')) ALTER TABLE [dbo].[StudentGrade] WITH CHECK ADD CONSTRAINT [FK_StudentGrade_Student] FOREIGN KEY([StudentID]) REFERENCES [dbo].[Person] ([PersonID]) GO ALTER TABLE [dbo].[StudentGrade] CHECK CONSTRAINT [FK_StudentGrade_Student] GO -- Define the relationship between CourseInstructor and Course. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_CourseInstructor_Course]') AND parent_object_id = OBJECT_ID(N'[dbo].[Course Instructor]')) ALTER TABLE [dbo].[CourseInstructor] WITH CHECK AD D
Página 44
Universidad de El Salvador.
CONSTRAINT [FK_CourseInstructor_Course] FOREIGN KEY([CourseID]) REFERENCES [dbo].[Course] ([CourseID]) GO ALTER TABLE [dbo].[CourseInstructor] CHECK CONSTRAINT [FK_CourseInstructor_Course] GO -- Define the relationship between CourseInstructor and Person. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_CourseInstructor_Person]') AND parent_object_id = OBJECT_ID(N'[dbo].[Course Instructor]')) ALTER TABLE [dbo].[CourseInstructor] WITH CHECK AD D CONSTRAINT [FK_CourseInstructor_Person] FOREIGN KEY([PersonID]) REFERENCES [dbo].[Person] ([PersonID]) GO ALTER TABLE [dbo].[CourseInstructor] CHECK CONSTRAINT [FK_CourseInstructor_Person] GO -- Define the relationship between Course and Depar tment. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Cour se_Department]') AND parent_object_id = OBJECT_ID(N'[dbo].[Co urse]')) ALTER TABLE [dbo].[Course] WITH CHECK ADD CONSTRAINT [FK_Course_Department] FOREIGN KEY([DepartmentID]) REFERENCES [dbo].[Department] ([DepartmentID]) GO ALTER TABLE [dbo].[Course] CHECK CONSTRAINT [FK_Cou rse_Department] GO --Define the relationship between OfficeAssignment and Person. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_OfficeAssignment_Person]') AND parent_object_id = OBJECT_ID(N'[dbo].[Office Assignment]')) ALTER TABLE [dbo].[OfficeAssignment] WITH CHECK AD D CONSTRAINT [FK_OfficeAssignment_Person] FOREIGN KEY([InstructorID]) REFERENCES [dbo].[Person] ([PersonID]) GO ALTER TABLE [dbo].[OfficeAssignment] CHECK CONSTRAINT [FK_OfficeAssignment_Person] GO -- Create InsertOfficeAssignment stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[InsertOfficeAssignment]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[InsertOfficeAssignment] @InstructorID int, @Location nvarchar(50) AS
Página 45
Universidad de El Salvador.
INSERT INTO dbo.OfficeAssignment (InstructorID, L ocation) VALUES (@InstructorID, @Location); IF @@ROWCOUNT > 0 BEGIN SELECT [Timestamp] FROM OfficeAssignment WHERE InstructorID=@InstructorID; END ' END GO --Create the UpdateOfficeAssignment stored procedur e. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[UpdateOfficeAssignment]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[UpdateOfficeAssignment] @InstructorID int, @Location nvarchar(50), @OrigTimestamp timestamp AS UPDATE OfficeAssignment SET Location=@Location WHERE InstructorID=@InstructorID AND [Timestamp]=@OrigTimestamp; IF @@ROWCOUNT > 0 BEGIN SELECT [Timestamp] FROM OfficeAssignment WHERE InstructorID=@InstructorID; END ' END GO -- Create the DeleteOfficeAssignment stored procedu re. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DeleteOfficeAssignment]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[DeleteOfficeAssignment] @InstructorID int AS DELETE FROM OfficeAssignment WHERE InstructorID=@InstructorID; ' END GO -- Create the DeletePerson stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DeletePerson ]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N'
Página 46
Universidad de El Salvador.
CREATE PROCEDURE [dbo].[DeletePerson] @PersonID int AS DELETE FROM Person WHERE PersonID = @PersonID; ' END GO -- Create the UpdatePerson stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[UpdatePerson ]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[UpdatePerson] @PersonID int, @LastName nvarchar(50), @FirstName nvarchar(50), @HireDate datetime, @EnrollmentDate datetime AS UPDATE Person SET LastName=@LastName, FirstName=@FirstName, HireDate=@HireDate, EnrollmentDate=@EnrollmentDate WHERE PersonID=@PersonID; ' END GO -- Create the InsertPerson stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[InsertPerson ]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[InsertPerson] @LastName nvarchar(50), @FirstName nvarchar(50), @HireDate datetime, @EnrollmentDate datetime AS INSERT INTO dbo.Person (LastName, FirstName, HireDate, EnrollmentDate) VALUES (@LastName, @FirstName, @HireDate, @EnrollmentDate); SELECT SCOPE_IDENTITY() as NewPersonID; ' END GO -- Create GetStudentGrades stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects
Página 47
Universidad de El Salvador.
WHERE object_id = OBJECT_ID(N'[dbo].[GetStudentGrades]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[GetStudentGrades] @StudentID int AS SELECT EnrollmentID, Grade, CourseID, S tudentID FROM dbo.StudentGrade WHERE StudentID = @StudentID ' END GO -- Create GetDepartmentName stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetDepartmentName]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[GetDepartmentName] @ID int, @Name nvarchar(50) OUTPUT AS SELECT @Name = Name FROM Department WHERE DepartmentID = @ID ' END GO -- Insert data into the Person table. USE School GO SET IDENTITY_INSERT dbo.Person ON GO INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (1, 'Abercrombie', 'Kim', '1995-03-11', null ); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (2, 'Barzdukas', 'Gytis', null, '2005-09-01' ); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (3, 'Justice', 'Peggy', null, '2001-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (4, 'Fakhouri', 'Fadi', '2002-08-06', null); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (5, 'Harui', 'Roger', '1998-07-01', null); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (6, 'Li', 'Yan', null, '2002-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate)
Página 48
Universidad de El Salvador.
VALUES (7, 'Norman', 'Laura', null, '2003-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (8, 'Olivotto', 'Nino', null, '2005-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (9, 'Tang', 'Wayne', null, '2005-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (10, 'Alonso', 'Meredith', null, '2002-09-01 '); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (11, 'Lopez', 'Sophia', null, '2004-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (12, 'Browning', 'Meredith', null, '2000-09- 01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (13, 'Anand', 'Arturo', null, '2003-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (14, 'Walker', 'Alexandra', null, '2000-09-0 1'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (15, 'Powell', 'Carson', null, '2004-09-01') ; INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (16, 'Jai', 'Damien', null, '2001-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (17, 'Carlson', 'Robyn', null, '2005-09-01') ; INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (18, 'Zheng', 'Roger', '2004-02-12', null); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (19, 'Bryant', 'Carson', null, '2001-09-01') ; INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (20, 'Suarez', 'Robyn', null, '2004-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (21, 'Holt', 'Roger', null, '2004-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (22, 'Alexander', 'Carson', null, '2005-09-0 1'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (23, 'Morgan', 'Isaiah', null, '2001-09-01') ; INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (24, 'Martin', 'Randall', null, '2005-09-01' ); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (25, 'Kapoor', 'Candace', '2001-01-15', null ); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate)
Página 49
Universidad de El Salvador.
VALUES (26, 'Rogers', 'Cody', null, '2002-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (27, 'Serrano', 'Stacy', '1999-06-01', null) ; INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (28, 'White', 'Anthony', null, '2001-09-01') ; INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (29, 'Griffin', 'Rachel', null, '2004-09-01' ); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (30, 'Shan', 'Alicia', null, '2003-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (31, 'Stewart', 'Jasmine', '1997-10-12', nul l); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (32, 'Xu', 'Kristen', '2001-7-23', null); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (33, 'Gao', 'Erica', null, '2003-01-30'); INSERT INTO dbo.Person (PersonID, LastName, FirstNa me, HireDate, EnrollmentDate) VALUES (34, 'Van Houten', 'Roger', '2000-12-07', nu ll); GO SET IDENTITY_INSERT dbo.Person OFF GO -- Insert data into the Department table. INSERT INTO dbo.Department (DepartmentID, [Name], B udget, StartDate, Administrator) VALUES (1, 'Engineering', 350000.00, '2007-09-01', 2); INSERT INTO dbo.Department (DepartmentID, [Name], B udget, StartDate, Administrator) VALUES (2, 'English', 120000.00, '2007-09-01', 6); INSERT INTO dbo.Department (DepartmentID, [Name], B udget, StartDate, Administrator) VALUES (4, 'Economics', 200000.00, '2007-09-01', 4) ; INSERT INTO dbo.Department (DepartmentID, [Name], B udget, StartDate, Administrator) VALUES (7, 'Mathematics', 250000.00, '2007-09-01', 3); GO -- Insert data into the Course table. INSERT INTO dbo.Course (CourseID, Title, Credits, D epartmentID) VALUES (1050, 'Chemistry', 4, 1); INSERT INTO dbo.Course (CourseID, Title, Credits, D epartmentID) VALUES (1061, 'Physics', 4, 1); INSERT INTO dbo.Course (CourseID, Title, Credits, D epartmentID) VALUES (1045, 'Calculus', 4, 7); INSERT INTO dbo.Course (CourseID, Title, Credits, D epartmentID) VALUES (2030, 'Poetry', 2, 2); INSERT INTO dbo.Course (CourseID, Title, Credits, D epartmentID) VALUES (2021, 'Composition', 3, 2); INSERT INTO dbo.Course (CourseID, Title, Credits, D epartmentID)
Página 50
Universidad de El Salvador.
VALUES (2042, 'Literature', 4, 2); INSERT INTO dbo.Course (CourseID, Title, Credits, D epartmentID) VALUES (4022, 'Microeconomics', 3, 4); INSERT INTO dbo.Course (CourseID, Title, Credits, D epartmentID) VALUES (4041, 'Macroeconomics', 3, 4); INSERT INTO dbo.Course (CourseID, Title, Credits, D epartmentID) VALUES (4061, 'Quantitative', 2, 4); INSERT INTO dbo.Course (CourseID, Title, Credits, D epartmentID) VALUES (3141, 'Trigonometry', 4, 7); GO -- Insert data into the OnlineCourse table. INSERT INTO dbo.OnlineCourse (CourseID, URL) VALUES (2030, 'http://www.fineartschool.net/Poetry' ); INSERT INTO dbo.OnlineCourse (CourseID, URL) VALUES (2021, 'http://www.fineartschool.net/Composi tion'); INSERT INTO dbo.OnlineCourse (CourseID, URL) VALUES (4041, 'http://www.fineartschool.net/Macroec onomics'); INSERT INTO dbo.OnlineCourse (CourseID, URL) VALUES (3141, 'http://www.fineartschool.net/Trigono metry'); --Insert data into OnsiteCourse table. INSERT INTO dbo.OnsiteCourse (CourseID, Location, D ays, [Time]) VALUES (1050, '123 Smith', 'MTWH', '11:30'); INSERT INTO dbo.OnsiteCourse (CourseID, Location, D ays, [Time]) VALUES (1061, '234 Smith', 'TWHF', '13:15'); INSERT INTO dbo.OnsiteCourse (CourseID, Location, D ays, [Time]) VALUES (1045, '121 Smith','MWHF', '15:30'); INSERT INTO dbo.OnsiteCourse (CourseID, Location, D ays, [Time]) VALUES (4061, '22 Williams', 'TH', '11:15'); INSERT INTO dbo.OnsiteCourse (CourseID, Location, D ays, [Time]) VALUES (2042, '225 Adams', 'MTWH', '11:00'); INSERT INTO dbo.OnsiteCourse (CourseID, Location, D ays, [Time]) VALUES (4022, '23 Williams', 'MWF', '9:00'); -- Insert data into the CourseInstructor table. INSERT INTO dbo.CourseInstructor(CourseID, PersonID ) VALUES (1050, 1); INSERT INTO dbo.CourseInstructor(CourseID, PersonID ) VALUES (1061, 31); INSERT INTO dbo.CourseInstructor(CourseID, PersonID ) VALUES (1045, 5); INSERT INTO dbo.CourseInstructor(CourseID, PersonID ) VALUES (2030, 4); INSERT INTO dbo.CourseInstructor(CourseID, PersonID ) VALUES (2021, 27); INSERT INTO dbo.CourseInstructor(CourseID, PersonID ) VALUES (2042, 25); INSERT INTO dbo.CourseInstructor(CourseID, PersonID ) VALUES (4022, 18); INSERT INTO dbo.CourseInstructor(CourseID, PersonID ) VALUES (4041, 32); INSERT INTO dbo.CourseInstructor(CourseID, PersonID ) VALUES (4061, 34); GO --Insert data into the OfficeAssignment table.
Página 51
Universidad de El Salvador.
INSERT INTO dbo.OfficeAssignment(InstructorID, Loca tion) VALUES (1, '17 Smith'); INSERT INTO dbo.OfficeAssignment(InstructorID, Loca tion) VALUES (4, '29 Adams'); INSERT INTO dbo.OfficeAssignment(InstructorID, Loca tion) VALUES (5, '37 Williams'); INSERT INTO dbo.OfficeAssignment(InstructorID, Loca tion) VALUES (18, '143 Smith'); INSERT INTO dbo.OfficeAssignment(InstructorID, Loca tion) VALUES (25, '57 Adams'); INSERT INTO dbo.OfficeAssignment(InstructorID, Loca tion) VALUES (27, '271 Williams'); INSERT INTO dbo.OfficeAssignment(InstructorID, Loca tion) VALUES (31, '131 Smith'); INSERT INTO dbo.OfficeAssignment(InstructorID, Loca tion) VALUES (32, '203 Williams'); INSERT INTO dbo.OfficeAssignment(InstructorID, Loca tion) VALUES (34, '213 Smith'); -- Insert data into the StudentGrade table. INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (2021, 2, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (2030, 2, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (2021, 3, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (2030, 3, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (2021, 6, 2.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (2042, 6, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (2021, 7, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (2042, 7, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (2021, 8, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (2042, 8, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4041, 9, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4041, 10, null); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4041, 11, 2.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4041, 12, null); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4061, 12, null); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4022, 14, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4022, 13, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4061, 13, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade)
Página 52
Universidad de El Salvador.
VALUES (4041, 14, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4022, 15, 2.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4022, 16, 2); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4022, 17, null); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4022, 19, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4061, 20, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4061, 21, 2); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4022, 22, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4041, 22, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4061, 22, 2.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (4022, 23, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1045, 23, 1.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1061, 24, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1061, 25, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1050, 26, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1061, 26, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1061, 27, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1045, 28, 2.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1050, 28, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1061, 29, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1050, 30, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, Grade) VALUES (1061, 30, 4); GO
Página 53
Universidad de El Salvador.
Bibliografía.
� www.msdn.microsoft.com
� Entity Framework Learning Guide (Zeeshan Hirani)
� ADO.NET Entity Framework 4.0 (Unai - Zorrilla - Castro)