Академический Документы
Профессиональный Документы
Культура Документы
Entity Framework.Net
Universidad de El Salvador. Facultad Multidisciplinaria de Occidente. Departamento de ingeniera y Arquitectura. Presentado por: Juan Jos Abarca Mena. Kelvin Geovanni Chicas. Walter Arvalo Moran. Luis Ernesto Martnez. Wallace Steed Velasquez. 23/05/2011
Universidad de El Salvador.
Introduccin.
ADO.NET Entity Framework admite aplicaciones y servicios centrados en datos, y proporciona una plataforma para la programacin con datos que eleva el nivel de abstraccin del nivel lgico relacional al nivel conceptual. Al permitir a los programadores trabajar con datos en un nivel de abstraccin superior, Entity Framework admite cdigo que es independiente de cualquier motor de almacenamiento de datos o esquema relacional determinados. Para obtener ms informacin, vea Informacin 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 informacin sobre la asignacin, el modelo conceptual y el de almacenamiento se almacena en un archivo .edmx. Entity Framework tambin 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 basndose en una base de datos existente. Esto reduce en gran medida el cdigo de acceso a datos que se sola necesitar para crear aplicaciones y servicios de datos basados en objetos, y agiliza la creacin de servicios y aplicaciones de datos orientadas a objetos a partir de una base de datos existente. Las herramientas tambin permiten compilar en primer lugar un modelo conceptual y, a continuacin, generar automticamente los objetos de CLR relacionados y una base de datos auxiliar.
Pgina 2
Universidad de El Salvador.
Pgina 3
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 diseo 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 organizacin lgica de eso tipos es tal y como se muestra en la tabla a continuacin. Todo esto refuerza la idea de la pertenencia de EF a la familia de ADO.NET.
Pgina 4
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 especficos.
Una de las caractersticas ms 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 aadido para aquellas empresas que quieran colocar su producto en el mercado. La
Pgina 5
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:
Pgina 6
Universidad de El Salvador.
Diseador de modelos EDM (Entity Data Model Designer) El diseador de modelos es una herramienta visual integrada dentro de Visual Studio 2010 que permite crear y editar modelos conceptuales. Este diseador est formado por los siguientes componentes: Una superficie de diseo 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 navegacin por el modelo, en la cual podremos ver arboles informacin sobre el modelo conceptual y el modelo fsico. de
Nuevos elementos dentro de la ventana de herramientas, que nos permitirn, por ejemplo, crear las entidades, las asociaciones o relaciones de herencia.
El diseador de modelos opera sobre ficheros de tipo edmx. Estos ficheros se forman mediante la combinacin de tres secciones de metadatos en formato XML (que en ocasiones pueden presentarse tambin 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 definicin 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 navegacin o asociacin es entre las distintas entidades. Para terminar, el archivo edmx contiene la seccin MSL (Mapping Schema Language), tambin conocida como seccin C-S, mediante la cual se especifican como se asocian o relacionan las entidades del modelo conceptual (definido en la seccin CSDK) con las tablas, vistas, columnas, etc. Del modelo fsico definido en la seccin SSDL.
Pgina 7
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 continuacin) crea un nuevo archivo edmx y lo agrega al proyecto en el que estemos trabajando. La siguiente figura, nos muestra un ejemplo de un diseador EDM y las distintas ventanas de herramientas con las que podemos trabajar:
Pgina 8
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 diseador. Para ello, este asistente permite crear el modelo a partir de una base de datos ya existente (la practica ms habitual a aunque no la nica). Con el fin de mostrar el asistente mencionado realizaremos un sencillo ejemplo, en realidad, el propsito del mismo es mas ensearle 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:
En un proyecto cualquiera de Visual Studio (un ejemplo de aplicacin 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.
Pgina 9
Universidad de El Salvador.
Pgina 10
Universidad de El Salvador.
Figura 7. Asistente de creacin 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:
Pgina 11
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 diseador 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 opcin Abrir con su men contextual y elegir el editor de XML. Ver como ahora en vez del diseador se muestra un archivo XML con las distintas secciones de metadatos (figuras 9 y 10).
Pgina 12
Universidad de El Salvador.
Asistente de actualizacin de modelos. Esta herramienta se utiliza para actualizar el modelo EDM despus 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 opcin actualizar modelo desde la base de datos. El asistente de actualizacin de modelos pone a nuestra disposicin tres pestaas de trabajo:
Opcin Agregar Descripcin Permite incorporar al modelo nuevos elementos del esquema de la base de datos. Muestra los elementos actuales en el modelo y permite seleccionar aquellos cuya definicin queramos refrescar o actualizar. Muestra los elementos actuales en el modelo y permite seleccionar cuales no deseamos que pertenezcan a l.
Refrescar
Eliminar
Tabla 3. Tabla de actualizacin de modelos. A continuacin se muestra un sencillo ejemplo del uso del asistente de actualizacin de un modelo EDM. Lo nico que se har es agregar una nueva columna a la tabla Customer con el fin de especificar su nmero de pasaporte, PassportNumber. Una vez agregada la columna en el modelo relacional con el que estamos trabajando, seleccionaremos la ventana de navegacin del modelo y haremos clic en la opcin de actualizacin del modelo conceptual que tenemos en su men contextual.
Pgina 13
Universidad de El Salvador.
El asistente de actualizacin nos mostrara las tres opciones de la tabla anterior; en nuestro caso, seleccionaremos la opcin 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 diseador nos actualiza la informacin (figura 13).
Pgina 14
Universidad de El Salvador.
Una vez que se produce la actualizacin de un modelo, se sobrescribe la seccin SSDL del fichero edmx correspondiente, por lo que si previamente hubiramos realizado cualquier modificacin sobre l, tales cambios se perdern y no se vern 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 seguirn 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 funcin de las secciones realizadas en la base de datos subyacente.
Pgina 15
Universidad de El Salvador.
EDMGen o Generador de EDM Por ltimo, EDMGen.exe es una herramienta de lnea 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 especfico de ADO.NET Entity Framework y generar las secciones SSDL, CSDL y MSL de EDM. Validar un modelo existente. Producir cdigo fuente a partir de la seccin CSDL.
Por defecto, EdmGen se sita en el directorio de la instalacin 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 algn proceso avanzado de generacin automtica de cdigo basado en modelos de entidades. En la siguiente tabla se muestra una lista de los diferentes modos de trabajo que ofrece EdmGen.
Pgina 16
Universidad de El Salvador.
Entity Client
Entity Client (o EntityClient, unido, nombre con una connotacin ms cercana al cdigo) es sin duda alguna, junto a EDM, uno de los elementos centrales dentro de ADO.NET Entity Framework. Como seguramente sabremos, desde la versin 2.0 de .NET disponemos de jerarquas de clases que engloban bajo un mismo paraguas de herencias clases necesarias para trabajar con los proveedores especficos para cada motor de base de datos, como SqlClient u OracleClient. Entity Client representa un nuevo conjunto de clases que se integran armnicamente dentro de esas jerarquas .
Figura 14. Jerarqua 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 fsicos 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 tambin a su nivel una arquitectura abierta, y es capaz de trabajar con diferentes proveedores de Entity Frame especficos, 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 ejecucin de dichas consultas y la recuperacin 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.
Pgina 17
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 mltiples bases de datos. Pero seguiremos sufriendo el trabajo de la recuperacin 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 materializacin). 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 materializacin automtica de los resultados, ganaremos tambin todas las ayudas que el compilador y el entorno integrado pueden ofrecernos, al estar trabajando en todo momento de una forma fuertemente tipada. En contraposicin al ejemplo del punto anterior, en el que se consultaban datos de un modelo conceptual usando Entity Client, a continuacin podremos ver cmo obtener esos mismos datos usando Object Services y materializando de forma automtica los resultados.
Pgina 18
Universidad de El Salvador.
Pgina 19
Universidad de El Salvador.
Entity Framework utiliza estos modelos y archivos de asignacin para transformar las operaciones de creacin, lectura, actualizacin y eliminacin 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.
Generacin de modelos.
Las aplicaciones y servicios de Entity Framework se basan en informacin de modelos y asignaciones que se expresa en tres lenguajes basados en XML:
1. Lenguaje de definicin de esquemas conceptuales (CSDL) El lenguaje de definicin 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 aplicacin 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 ms informacin, vea Especificacin SSDL y Especificacin MSL. CSDL es la implementacin de Entity Framework de Entity Data Model. En una aplicacin 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 mtodos 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 especficos del origen de datos. 2. Lenguaje de definicin de esquemas de almacenamiento (SSDL) El lenguaje de definicin de esquemas de almacenamiento (SSDL) es un lenguaje basado en XML que describe el modelo de almacenamiento de una aplicacin Entity Framework. En una aplicacin 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 travs de mtodos de la clase System.Data.Metadata.Edm.MetadataWorkspace. Entity Framework usa los
Pgina 20
Universidad de El Salvador.
metadatos del modelo de almacenamiento para convertir las consultas realizadas sobre el modelo conceptual en comandos especficos del almacenamiento. 3. Lenguaje de especificacin de asignaciones (MSL) El lenguaje de especificacin de asignaciones (MSL) es un lenguaje basado en XML que describe la asignacin entre el modelo conceptual y el modelo de almacenamiento de una aplicacin de Entity Framework . En una aplicacin de Entity Framework , los metadatos de asignacin se cargan desde un archivo .msl (escrito en MSL) en tiempo de compilacin. Entity Framework usa los metadatos de asignacin en tiempo de ejecucin para convertir las consultas realizadas contra el modelo conceptual en comandos especficos del almacenamiento.
Pgina 21
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 tambin pueden personalizar las clases que se generan para un modelo conceptual.
Pgina 22
Universidad de El Salvador.
Cuando no se requiere la materializacin de los objetos, el proveedor de EntityClient tambin se puede utilizar como un proveedor de datos ADO.NET estndar 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 tambin expone un mtodo 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 automticamente o bien por los procedimientos almacenados que el programador especifica. Para obtener ms informacin, vea Crear, agregar, modificar y eliminar objetos (Entity Framework).
Pgina 23
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 cannicos.
Pgina 24
Universidad de El Salvador.
Modelo conceptual
El modelo conceptual para una aplicacin expresa entidades y relaciones en el lenguaje de definicin de esquemas conceptuales (CSDL), que es una implementacin 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 estn compuestos de una o ms propiedades escalares o complejas. Los atributos XML tambin pueden especificar la posibilidad de aceptar NULL o asignar un valor predeterminado. Las asociaciones definen las relaciones entre las entidades. Los elementos y la terminologa del lenguaje Entity Framework se explican con ms detalle en Terminologa 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 estn relacionados por la asociacin FK_Course_Department; las dems 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="SchoolModel.Course" /> <EntitySet Name="Departments" EntityType="SchoolModel.Department" /> <AssociationSet Name="FK_Course_Department" Association="SchoolModel.FK_Course_Department"> <End Role="Department" EntitySet="Departments" /> <End Role="Course" EntitySet="Courses" /> </AssociationSet> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="Int32" Nullable="false" /> <Property Name="Title" Type="String" Nullable="false" MaxLength="100" Unicode="true" FixedLength="false" /> <Property Name="Credits" Type="Int32" Nullable="false" /> <Property Name="DepartmentID" Type="Int32" Nullable="false" /> <NavigationProperty Name="Department" Relationship="SchoolModel.FK_Course_Department" FromRole="Course" ToRole="Department" /> </EntityType>
Pgina 25
Universidad de El Salvador.
<EntityType Name="Department"> <Key> <PropertyRef Name="DepartmentID" /> </Key> <Property Name="DepartmentID" Type="Int32" Nullable="false" /> <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> <Property Name="Budget" Type="Decimal" Nullable="false" Precision="19" Scale="4" /> <Property Name="StartDate" Type="DateTime" Nullable="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.Department" Multiplicity="1" /> <End Role="Course" Type="SchoolModel.Course" Multiplicity="*" /> <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 definicin 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 estn relacionadas por la clave externa FK_Course_Department; las dems entidades y asociaciones se han quitado:
<Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSche maGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
Pgina 26
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.Department" store:Type="Tables" Schema="dbo" /> <AssociationSet Name="FK_Course_Department" Association="SchoolModel.Store.FK_Course_Department"> <End Role="Department" EntitySet="Department" /> <End Role="Course" EntitySet="Course" /> </AssociationSet> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullable="false" /> <Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="100" /> <Property Name="Credits" Type="int" Nullable="false" /> <Property Name="DepartmentID" Type="int" Nullable="false" /> </EntityType> <EntityType Name="Department"> <Key> <PropertyRef Name="DepartmentID" /> </Key> <Property Name="DepartmentID" Type="int" Nullable="false" /> <Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Budget" Type="money" Nullable="false" /> <Property Name="StartDate" Type="datetime" Nullable="false" /> <Property Name="Administrator" Type="int" /> </EntityType> <Association Name="FK_Course_Department"> <End Role="Department" Type="SchoolModel.Store.Department" Multiplicity="1" /> <End Role="Course" Type="SchoolModel.Store.Course" Multiplicity="*" /> <ReferentialConstraint> <Principal Role="Department"> <PropertyRef Name="DepartmentID" /> </Principal> <Dependent Role="Course"> <PropertyRef Name="DepartmentID" /> </Dependent> </ReferentialConstraint> </Association> </Schema>
Pgina 27
Universidad de El Salvador.
Especificacin de asignaciones
Una especificacin de asignaciones usa el lenguaje de especificacin de asignaciones (MSL) para asignar el modelo conceptual al modelo de almacenamiento. El siguiente fragmento de MSL muestra una asignacin unvoca 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/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" CdmEntityContainer="SchoolEntities"> <EntitySetMapping Name="Courses"> <EntityTypeMapping TypeName="SchoolModel.Course"> <MappingFragment StoreEntitySet="Course"> <ScalarProperty Name="CourseID" ColumnName="CourseID" /> <ScalarProperty Name="Title" ColumnName="Title" /> <ScalarProperty Name="Credits" ColumnName="Credits" /> <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> <EntitySetMapping Name="Departments"> <EntityTypeMapping TypeName="SchoolModel.Department"> <MappingFragment StoreEntitySet="Department"> <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" /> <ScalarProperty Name="Name" ColumnName="Name" /> <ScalarProperty Name="Budget" ColumnName="Budget" /> <ScalarProperty Name="StartDate" ColumnName="StartDate" /> <ScalarProperty Name="Administrator" ColumnName="Administrator" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping>
Pgina 28
Universidad de El Salvador.
vistas se puede invocar en tiempo de diseo o en tiempo de ejecucin cuando la primera consulta se ejecuta contra un modelo conceptual. Entity Framework se basa en proveedores de datos ADO.NET especficos 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 cannico, que es una representacin del modelo de objetos de la consulta. Los rboles de comandos cannicos representan comandos SELECT, UPDATE, INSERT y DELETE. La totalidad del procesamiento subsiguiente se realiza en el rbol de comandos, que es el medio de comunicacin 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 creacin, actualizacin y eliminacin de objetos entidad. Entity Framework admite consultas de objeto contra un modelo conceptual. Las consultas se pueden crear utilizando mtodos 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 estn 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 coleccin de entidad de objetos Course basada en la asociacin 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 automticamente, y se debe llamar al mtodo Load de la referencia de entidad para cargar los datos de los objetos relacionados en el contexto de los objetos. Tambin puede especificar la ruta de una consulta que defina qu objetos relacionados se han de cargar con los objetos devueltos. Para obtener ms informacin, 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 definicin de la ruta de una consulta garantiza que tambin se devuelvan los objetos Course relacionados con los objetos Department. Una clusula 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.
Pgina 29
Universidad de El Salvador.
var departmentQuery = from d in schoolContext.Departments.Include("Courses") orderby d.Name select d;
Entity Framework realiza el seguimiento de los cambios en los datos de entidad y permite conservar los cambios en el origen de datos.
Pgina 30
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 podrn 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 cmo trabajan. A continuacin se muestra el modelo School mostrado en el ADO.NET Entity Data Model Designer:
Pgina 31
Universidad de El Salvador.
Para el ejemplo hemos utilizado 2 formularios, uno al que llamaremos Visor del Curso e Informacin. A continuacin se describen cada uno de ellos de forma individual, junto con su codificacin respectiva. Puede consultar tambin el demo adjunto a este documento, que contiene este ejemplo descrito a continuacin, para su respectiva prueba.
Formulario 1.
Pgina 32
Universidad de El Salvador.
Cdigo del formulario 1.
using using using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms; System.Data.Objects; 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);
Pgina 33
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(); }
Pgina 34
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); } } } }
Pgina 35
Universidad de El Salvador.
Formulario 2.
using using using using using using using using using using
System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms; System.Data.Objects; System.Data.Objects.DataClasses;
Pgina 36
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;
Pgina 37
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; } } }
Pgina 38
Universidad de El Salvador.
Nuestro modelo Entity lucira as:
Pgina 39
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,
Pgina 40
Universidad de El Salvador.
CONSTRAINT [PK_School.Student] PRIMARY KEY CLUSTERED ( [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]
Pgina 41
Universidad de El Salvador.
END GO -- Create the CourseInstructor table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CourseInstructor]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[CourseInstructor]( [CourseID] [int] NOT NULL, [PersonID] [int] NOT NULL, CONSTRAINT [PK_CourseInstructor] PRIMARY KEY CLUSTERED ( [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 CLUSTERED ( [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].[OfficeAssignment]') 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 CLUSTERED ( [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
Pgina 42
Universidad de El Salvador.
WHERE object_id = OBJECT_ID(N'[dbo].[FK_OnsiteCourse_Course]') AND parent_object_id = OBJECT_ID(N'[dbo].[OnsiteCourse]')) 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].[OnlineCourse]')) 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].[StudentGrade]')) 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].[StudentGrade]')) 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].[CourseInstructor]')) ALTER TABLE [dbo].[CourseInstructor] WITH CHECK ADD
Pgina 43
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].[CourseInstructor]')) ALTER TABLE [dbo].[CourseInstructor] WITH CHECK ADD 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 Department. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Course_Department]') AND parent_object_id = OBJECT_ID(N'[dbo].[Course]')) 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_Course_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].[OfficeAssignment]')) ALTER TABLE [dbo].[OfficeAssignment] WITH CHECK ADD 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
Pgina 44
Universidad de El Salvador.
INSERT INTO dbo.OfficeAssignment (InstructorID, Location) VALUES (@InstructorID, @Location); IF @@ROWCOUNT > 0 BEGIN SELECT [Timestamp] FROM OfficeAssignment WHERE InstructorID=@InstructorID; END ' END GO --Create the UpdateOfficeAssignment stored procedure. 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 procedure. 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'
Pgina 45
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
Pgina 46
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, StudentID 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, FirstName, EnrollmentDate) VALUES (1, 'Abercrombie', 'Kim', '1995-03-11', null); INSERT INTO dbo.Person (PersonID, LastName, FirstName, EnrollmentDate) VALUES (2, 'Barzdukas', 'Gytis', null, '2005-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, EnrollmentDate) VALUES (3, 'Justice', 'Peggy', null, '2001-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, EnrollmentDate) VALUES (4, 'Fakhouri', 'Fadi', '2002-08-06', null); INSERT INTO dbo.Person (PersonID, LastName, FirstName, EnrollmentDate) VALUES (5, 'Harui', 'Roger', '1998-07-01', null); INSERT INTO dbo.Person (PersonID, LastName, FirstName, EnrollmentDate) VALUES (6, 'Li', 'Yan', null, '2002-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, EnrollmentDate)
HireDate,
HireDate,
HireDate,
HireDate,
HireDate,
HireDate,
HireDate,
Pgina 47
Universidad de El Salvador.
VALUES (7, 'Norman', 'Laura', null, '2003-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (8, 'Olivotto', 'Nino', null, '2005-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (9, 'Tang', 'Wayne', null, '2005-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (10, 'Alonso', 'Meredith', null, '2002-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (11, 'Lopez', 'Sophia', null, '2004-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (12, 'Browning', 'Meredith', null, '2000-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (13, 'Anand', 'Arturo', null, '2003-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (14, 'Walker', 'Alexandra', null, '2000-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (15, 'Powell', 'Carson', null, '2004-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (16, 'Jai', 'Damien', null, '2001-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (17, 'Carlson', 'Robyn', null, '2005-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (18, 'Zheng', 'Roger', '2004-02-12', null); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (19, 'Bryant', 'Carson', null, '2001-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (20, 'Suarez', 'Robyn', null, '2004-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (21, 'Holt', 'Roger', null, '2004-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (22, 'Alexander', 'Carson', null, '2005-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (23, 'Morgan', 'Isaiah', null, '2001-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (24, 'Martin', 'Randall', null, '2005-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (25, 'Kapoor', 'Candace', '2001-01-15', null); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate)
Pgina 48
Universidad de El Salvador.
VALUES (26, 'Rogers', 'Cody', null, '2002-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (27, 'Serrano', 'Stacy', '1999-06-01', null); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (28, 'White', 'Anthony', null, '2001-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (29, 'Griffin', 'Rachel', null, '2004-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (30, 'Shan', 'Alicia', null, '2003-09-01'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (31, 'Stewart', 'Jasmine', '1997-10-12', null); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (32, 'Xu', 'Kristen', '2001-7-23', null); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (33, 'Gao', 'Erica', null, '2003-01-30'); INSERT INTO dbo.Person (PersonID, LastName, FirstName, HireDate, EnrollmentDate) VALUES (34, 'Van Houten', 'Roger', '2000-12-07', null); GO SET IDENTITY_INSERT dbo.Person OFF GO -- Insert data into the Department table. INSERT INTO dbo.Department (DepartmentID, [Name], Budget, StartDate, Administrator) VALUES (1, 'Engineering', 350000.00, '2007-09-01', 2); INSERT INTO dbo.Department (DepartmentID, [Name], Budget, StartDate, Administrator) VALUES (2, 'English', 120000.00, '2007-09-01', 6); INSERT INTO dbo.Department (DepartmentID, [Name], Budget, StartDate, Administrator) VALUES (4, 'Economics', 200000.00, '2007-09-01', 4); INSERT INTO dbo.Department (DepartmentID, [Name], Budget, StartDate, Administrator) VALUES (7, 'Mathematics', 250000.00, '2007-09-01', 3); GO
-- Insert data into the Course table. INSERT INTO dbo.Course (CourseID, Title, VALUES (1050, 'Chemistry', 4, 1); INSERT INTO dbo.Course (CourseID, Title, VALUES (1061, 'Physics', 4, 1); INSERT INTO dbo.Course (CourseID, Title, VALUES (1045, 'Calculus', 4, 7); INSERT INTO dbo.Course (CourseID, Title, VALUES (2030, 'Poetry', 2, 2); INSERT INTO dbo.Course (CourseID, Title, VALUES (2021, 'Composition', 3, 2); INSERT INTO dbo.Course (CourseID, Title,
Credits, DepartmentID) Credits, DepartmentID) Credits, DepartmentID) Credits, DepartmentID) Credits, DepartmentID) Credits, DepartmentID)
Pgina 49
Universidad de El Salvador.
VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES GO (2042, 'Literature', 4, 2); INTO dbo.Course (CourseID, Title, (4022, 'Microeconomics', 3, 4); INTO dbo.Course (CourseID, Title, (4041, 'Macroeconomics', 3, 4); INTO dbo.Course (CourseID, Title, (4061, 'Quantitative', 2, 4); INTO dbo.Course (CourseID, Title, (3141, 'Trigonometry', 4, 7);
-- 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/Composition'); INSERT INTO dbo.OnlineCourse (CourseID, URL) VALUES (4041, 'http://www.fineartschool.net/Macroeconomics'); INSERT INTO dbo.OnlineCourse (CourseID, URL) VALUES (3141, 'http://www.fineartschool.net/Trigonometry'); --Insert data into OnsiteCourse table. INSERT INTO dbo.OnsiteCourse (CourseID, Location, VALUES (1050, '123 Smith', 'MTWH', '11:30'); INSERT INTO dbo.OnsiteCourse (CourseID, Location, VALUES (1061, '234 Smith', 'TWHF', '13:15'); INSERT INTO dbo.OnsiteCourse (CourseID, Location, VALUES (1045, '121 Smith','MWHF', '15:30'); INSERT INTO dbo.OnsiteCourse (CourseID, Location, VALUES (4061, '22 Williams', 'TH', '11:15'); INSERT INTO dbo.OnsiteCourse (CourseID, Location, VALUES (2042, '225 Adams', 'MTWH', '11:00'); INSERT INTO dbo.OnsiteCourse (CourseID, Location, VALUES (4022, '23 Williams', 'MWF', '9:00');
Days, [Time]) Days, [Time]) Days, [Time]) Days, [Time]) Days, [Time]) Days, [Time])
-- 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.
Pgina 50
Universidad de El Salvador.
INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INTO dbo.OfficeAssignment(InstructorID, (1, '17 Smith'); INTO dbo.OfficeAssignment(InstructorID, (4, '29 Adams'); INTO dbo.OfficeAssignment(InstructorID, (5, '37 Williams'); INTO dbo.OfficeAssignment(InstructorID, (18, '143 Smith'); INTO dbo.OfficeAssignment(InstructorID, (25, '57 Adams'); INTO dbo.OfficeAssignment(InstructorID, (27, '271 Williams'); INTO dbo.OfficeAssignment(InstructorID, (31, '131 Smith'); INTO dbo.OfficeAssignment(InstructorID, (32, '203 Williams'); INTO dbo.OfficeAssignment(InstructorID, (34, '213 Smith'); Location) Location) Location) Location) Location) Location) Location) Location) Location)
-- Insert data into the StudentGrade table. INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (2021, 2, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (2030, 2, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (2021, 3, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (2030, 3, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (2021, 6, 2.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (2042, 6, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (2021, 7, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (2042, 7, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (2021, 8, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (2042, 8, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (4041, 9, 3.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (4041, 10, null); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (4041, 11, 2.5); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (4041, 12, null); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (4061, 12, null); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (4022, 14, 3); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (4022, 13, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID, VALUES (4061, 13, 4); INSERT INTO dbo.StudentGrade (CourseID, StudentID,
Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade) Grade)
Pgina 51
Universidad de El Salvador.
VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES GO (4041, 14, 3); INTO dbo.StudentGrade (4022, 15, 2.5); INTO dbo.StudentGrade (4022, 16, 2); INTO dbo.StudentGrade (4022, 17, null); INTO dbo.StudentGrade (4022, 19, 3.5); INTO dbo.StudentGrade (4061, 20, 4); INTO dbo.StudentGrade (4061, 21, 2); INTO dbo.StudentGrade (4022, 22, 3); INTO dbo.StudentGrade (4041, 22, 3.5); INTO dbo.StudentGrade (4061, 22, 2.5); INTO dbo.StudentGrade (4022, 23, 3); INTO dbo.StudentGrade (1045, 23, 1.5); INTO dbo.StudentGrade (1061, 24, 4); INTO dbo.StudentGrade (1061, 25, 3); INTO dbo.StudentGrade (1050, 26, 3.5); INTO dbo.StudentGrade (1061, 26, 3); INTO dbo.StudentGrade (1061, 27, 3); INTO dbo.StudentGrade (1045, 28, 2.5); INTO dbo.StudentGrade (1050, 28, 3.5); INTO dbo.StudentGrade (1061, 29, 4); INTO dbo.StudentGrade (1050, 30, 3.5); INTO dbo.StudentGrade (1061, 30, 4);
(CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade) (CourseID, StudentID, Grade)
Pgina 52
Universidad de El Salvador.
Bibliografa.
www.msdn.microsoft.com Entity Framework Learning Guide (Zeeshan Hirani) ADO.NET Entity Framework 4.0 (Unai - Zorrilla - Castro)
Pgina 53