Cinco Estrellas ADO.NET Entity Framework Estrella Gold
Agenda Introducción a ADO.NET Entity Framework Arquitectura de ADO.NET Entity Framework Niveles de Abstracción ▫Conceptual Layer Schema Language (CLSL) ▫Mapping Schema Language (MSL) ▫Store Layer Schema Language (SLSL) Mappings ▫Tablas Multiples ▫Herencia Programando con Entidades ▫EntityClient ▫Object Services ▫LINQ to Entities Demo Referencias
Introduccion Instalación ▫Make sure that you have supported versons of Visual Studio 2008 RTM sucessfully installed on the machine, if not you could Download and install trial or Express editions of Visual Studio 2008 RTM from Visual Studio 2008 Portal (and reboot the machine if prompted). Note: Microsoft.NET Framework 3.5 is included in the Visual Studio 2008 RTM installationVisual Studio 2008 Portal ▫Bajar e instalar el XML Editor QFE.XML Editor QFE ▫Bajar e instalar el ADO.NET Entity Framework Beta 3.ADO.NET Entity Framework Beta 3 ▫Download and run the ADO.Net Entity Framework Tools Dec 07 CTP for 32-bit versions of Windows and follow the steps in the setup wizardADO.Net Entity Framework Tools Dec 07 CTP ▫Bajar el ADO.Net Entity Framework Tools Dec 07 Community Technology Preview del sitio de descarga de Microsoft Requerimientos de sistema ▫Sistemas operativos soportados: Windows Server 2003; Windows Vista; Windows XP Service Pack 2 (solo versiones en ingles de Windows Server 2003; Windows Vista y Windows XP Service Pack 2) ▫Ediciones de Visual Studio 2008 soportadas: Standard, Professional, Team Edition, and Express editions (C#, VB and Visual Web Developer). ▫Tipos de proyectos soportados: ASP.NET website, ASP.NET web application, Console, WinForms, y Librerías. ▫Lenguajes.NET soportados: C# and Visual Basic.
Introducción a ADO.NET Entity Framework class DataAccess { static void GetNewOrders(DateTime date, int qty) { using (SqlConnection con = new SqlConnection(Settings.Default.NWDB)) { con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText o.OrderDate, o.OrderID, SUM(d.Quantity) as Total " + "FROM Orders AS o LEFT JOIN [Order Details] AS d ON o.OrderID = d.OrderID " + " WHERE o.OrderDate GROUP BY o.OrderID HAVING Total >= 1000"; date); DbDataReader r = cmd.ExecuteReader(); while (r.Read()) { Console.WriteLine("{0:d}:\t{1}:\t{2}", r["OrderDate"], r["OrderID"], r["Total"]); } Las consultas se expresan mediante cadenas de caracteres opacas para el lenguaje de programación. La consulta incluye un LEFT JOIN necesario para reunir las filas de las tablas de pedidos y detalles de pedidos, y no está directamente relacionada con la petición de negocio. Los resultados se devuelven en registros de datos sin tipos.
class DataAccess { static void GetNewOrders(DateTime date, int qty) { using (EntityConnection con = new EntityConnection("Name=NorthwindEntities")) { con.Open(); EntityCommand cmd = con.CreateCommand(); cmd.CommandText o.OrderDate, o.OrderId, o.Total FROM " + "(SELECT o.OrderId, SUM(o.OrderDetails.Quantity) AS Total, FROM Orders " + "AS o WHERE o.OrderDate AS o WHERE o.Total >= 1000"; date); DbDataReader r = cmd.ExecuteReader(); while (r.Read()) { Console.WriteLine("{0:d}:\t{1}:\t{2}", r["OrderDate"], r["OrderID"], r["Total"]); } } } } Esta variante del código anterior (que usa el nuevo proveedor EntityClient) permite un patrón similar, pero accediendo a nivel de la capa conceptual. Introducción a ADO.NET Entity Framework
class DataAccess { static void GetNewOrders(DateTime date, int qty) { using (NorthWindDB nw = new NorthWindDB()) { var orders = from o in nw.Orders where o.OrderDate > date select new {o.orderID, o.OrderDate, Total=o.OrderLines.Sum(l => l.Quantity)}; foreach (SalesOrder o in orders) { Console.WriteLine("{0:d}\t{1}\t{2}", o.OrderDate, o.OrderId, o.Total); } } } } Esta variante (que usa LINQ to Entity) permite mantenerse en la capa conceptual y adicionalmente aprovechar las mejoras en el lenguaje C#. Introducción a ADO.NET Entity Framework
Problema: desajustes de impedancia entre las aplicaciones y las bases de datos relacionales. Solución: elevar el nivel de abstracción del nivel lógico (relacional) al conceptual (de entidad) a traves de … ▫… un modelo de Datos de Entidades (Entity Data Model - EDM) ▫… un lenguaje de consultas para EDM ▫… un motor de mapeado completo que traduce del nivel conceptual al lógico (relacional) ▫… y un conjunto de herramientas guiadas por modelos que ayudan a crear los transformadores entidad-objeto, objeto-xml y entidad-xml. La implementación de Microsoft de todos estos servicios se denomina ADO.NET Entity Framework.
Componentes de ADO.NET Entity Framework Un modelo de Datos de Entidades (Entity Data Model - EDM). Un lenguaje que describe el esquema conceptual (CSDL). Un lenguaje de mapeado de esquema lógico a conceptual (MSL). Un lenguaje que describe el esquema lógico (SSDL). Un motor de mapeado completo que traduce del nivel conceptual al lógico (relacional). Un lenguaje de consultas denominado eSQL, similar a SQL, pero con soporte para objetos/entidades. Tres modos de acceso a datos a traves de la capa de entidades conceptuales: ▫Un proveedor de acceso a datos denominado EntityClient. ▫Un modelo de objetos denominado Object Services. ▫Soporte para consultas vía LINQ (LINQ to Entity). Extensiones para Visual Studio 2005 (editores, plantillas, etc.).
Arquitectura de ADO.NET Entity Framework Base de Datos relacional Soporte para consultas vía LINQ denominado LINQ to Entities Un modelo de objetos para acceder a la capa conceptual Un objeto para generar consultas dentro del modelo Object Services Lenguaje denominado eSQL o Entity SQL semejante a SQL pero con capacidades adicionales Niveles de abstracción Nivel conceptual descrito por un lenguaje denominado Conceptual Schema Definition Language (CSDL) Un lenguaje de mapeado de esquema lógico a esquema conceptual (MSL) Nivel Lógico descrito por un lenguaje denominado Store Schema Definition Language (SSDL) Proveedor de acceso a datos semejante a SqlClient
Niveles de Abstracción Nivel de Abstracción Descripción Conceptual Mapping Lógico Conceptual Schema Data Language (CSDL) Modelo para uso desde la aplicación Mapping Schema Language (MSL) Transformación de modelo de base de datos a modelo conceptual Store Schema Data Language (SSDL) Modelo de Base de Datos Relacional
Clases OO Entity Data Model Entity Data Model Schema Database Objects Schema C-S SSDLCSDL Presentación (Forms/Reports) Servicios Clases OO Modelo ConceptualModelo Lógico Map Base de Datos Relacional
3.Seleccionar la conexión como muestra la figura. 4.En este momento puede crear un nombre que sera usado como string de conexión en el archivo config, asi como para nombrar la clase principal de acceso a las entidades que estamos creando, por ejemplo: "NWEntities.“ 5.En la última página, vemos las tables, vistas, o procedimientos almacenados que queremos incluir en el EDM. Para finalizar, el asistente crea el modelo en un archivo EDMX y code-behind asociado. Creando un Entity Data Model 2.Seleccione la opción de crear un EDM a partir de una base de datos existente. 1.En Visual Studio, en un proyecto agregar un nuevo item de tipo "ADO.NET Entity Data Model".
Creando un Entity Data Model
Archivos EDMX El archivo EDMX contiene la definición del modelo conceptual, del mapeo y del modelo lógico. Veamos en detalle su contenido:
Archivos EDMX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Archivos EDMX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Archivos EDMX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Archivos EDMX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Archivos EDMX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Archivos EDMX
Programando con Entidades 1.En Visual Studio 2008 crear un nuevo proyecto de cualquier tipo. 2.Agregar un nuevo ítem al proyecto de tipo ADO.NET Entity Data Model como vimos antes para generar el EDM (el motor crea una clase para cada objeto seleccionado y crea los mapeos correspondientes). 3.Modificar manualmente en la ventana “Mapping Details” los mapeos (herencia, tablas múltiples, cambio de nombres, etc.) 4.Usar los objetos creados usando uno de los 3 métodos predefinidos: 1.EntityClient 2.Object Services 3.LINQ to Entity
Programando con EntityClient... string city = “London”; String sql = “SELECT VALUE c FROM NWEntities.Customers AS c WHERE c.City using (EntityConnection cn = new EntityConnection(“Name=NorthwindEntities”)) { cn.Open(); EntityCommand cmd = cn.CreateCommand(); cmd.CommandText = sql; cmd.Parameters.AddWithValue(“city”, city); DbDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess); while (rdr.Read()) { Console.WriteLine(rdr[“CompanyName”].ToString()); } rdr.Close(); }...
Programando con Object Services... string city = “London”; string sql = “SELECT VALUE c FROM Customers AS c WHERE c.City ObjectParameter par = new ObjectParameter(“city”, city); ObjectQuery query = NWContext.CreateQuery (sql, par); foreach (Customers c in query) { Console.WriteLine(c.CompanyName); }...
Programando con LINQ to Entity... NWEntities db = new NWEntities(); using (db) { var q = from c in db.Customers where c.City == “London” select c; this.gridView1.DataSource = q; this.gridView1.DataBind(); }...
Demo
Referencias Chen, Peter Pin-Shan. The Entity-Relationship Model—toward a unified view of data, ACM Transactions on Database Systems, Vol. 1, Nº 1, marzo de 1976, pp Lenguaje Unificado de Modelado. The Entity Data Model. ADO.NET Technical Preview, mayo 4 de eSQL: An Entity SQL Language, ADO.NET Technical Preview, mayo de ADO.NET The Entity Framework Architecture. ADO.NET Technical Preview, mayo 4 de ADO.NET Tech Preview Overview, mayo 4 de 2006.