dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic •...

60
dedicada a los profesionales de la plataforma .NET www.dotnetmania.com nº 58 abril 2009 6,50 Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía Entity Framework entrevista Danny Simmons y Diego Vega Dev Manager y Program Manager Equipo de desarrollo de Entity Framework Microsoft Corp. eventos MIX 2009 Global MVP Summit 2009

Transcript of dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic •...

Page 1: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dedicada a los profesionales de la plataforma .NET

www.

dotne

tman

ia.co

m

nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework

dotNetManíaEntity Framework

entrevistaDanny Simmons y Diego Vega Dev Manager y Program ManagerEquipo de desarrollo de Entity FrameworkMicrosoft Corp.

eventosMIX 2009 Global MVP Summit 2009

dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 1 - (desvan)

Page 2: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 2 - (desvan)

Page 3: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Bienvenido al número 58, de abril de 2009,de dotNetManía.

Sin lugar a dudas, el evento más impor-tante y esperado desde el PDC era el MIX2009, celebrado recientemente en LasVegas. En él se han presentado muchasnovedades, tales como: la primera beta deSilverlight 3, que permitirá la reproduc-ción de vídeo en alta definición a pantallacompleta, en directo y bajo demanda, conla compatibilidad con el formato H.264;la versión preliminar de Expression Blend3, diseñada para mejorar la productividady los flujos de trabajo entre diseñadores ydesarrolladores, que permitirá importardirectamente archivos de Adobe Photos-hop e Illustrator; diversos componentesde la Plataforma Web de Microsoft, entrelos que se encuentra Web Platform Insta-ller 2.0 Beta, una herramienta que simpli-fica la instalación y actualización de diver-sos productos para la Web, o WindowsWeb Application Gallery, que permite alos desarrolladores descargar aplicacionesy componentes gratuitos que les ayuden acrear aplicaciones Web o subir los suyospropios; el esperado Windows InternetExplorer 8, con nuevas posibilidades paralos desarrolladores Web como los acele-radores y web slices; y, finalmente, unaactualización significativa de la Platafor-ma de servicios Azure. Puede leer la infor-mación completa en la sección de noticias,y también en la crónica del evento que haceMiguel Jiménez, quien también cubrióel evento Global MVP Summit 2009, elencuentro anual entre sus grupos de pro-ducto y los MVP de todo el mundo, cele-brado en Seattle.

El apoyo al desarrollo de aplicacionesWeb y a los servicios online que ofreceMicrosoft es algo constatable, inclusolocalmente, de lo que dan muestra feha-ciente los últimos proyectos puestos enmarcha en esa línea. El más reciente esMSDN Respuestas, un add-in desarrolla-

do por Microsoft Ibérica que hará quepodamos realizar búsquedas de solucionesa nuestros problemas desde el propioVisual Studio incluso entre los foros deMicrosoft o las comunidades de desarro-lladores. Repasamos cada iniciativa toma-da localmente también desde las páginasde actualidad de este mes.

El ejemplar de este mes está centradocasi monográficamente en Entity Frame-work, ahora que este marco de trabajo haalcanzado la madurez suficiente —las empre-sas ya lo están utilizando y empieza a haberabundante documentación sobre él—. Lacoordinación técnica de este especial hacorrido a cargo de Unai Zorrilla, coautorjunto con Octavio Hernández y EduardoQuintás del libro “ADO.NET Entity Fra-mework. Aplicaciones y servicios centradosen datos” (editado por Krasis en perfecto cas-tellano), y coautor de la serie de artículos “ElMarco de Entidades de ADO.NET 3.5” quevenimos editando desde hace tiempo en dot-NetManía. Puede leer un resumen de lopublicado este mes en el artículo de presen-tación que Unai mismo ha escrito.

Adicionalmente, quiero presentarle aAlberto Población, que a partir de este messe hará cargo de la sección de preguntas yrespuestas. Alberto está muy involucrado entodo lo que tiene que ver con la ayuda a losmiembros de la comunidad que la necesiten.En los foros y grupos de noticias de C# yotras tecnologías .NET, todo el mundo leconoce por su buen hacer. Esta sección resu-mirá cada mes lo mejor de la experiencia deAlberto en la resolución de problemas fre-cuentes a los que se enfrentan los desarro-lladores.

No puedo terminar estas notas sin antesagradecer públicamente a Dino Esposito—anterior titular de la columna—, por elgran trabajo realizado durante los últimosaños. Mil gracias, Dino.

Espero que el ejemplar sea de suagrado.

Apuesta por el desarrollo Web

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 58 • Abril 2009Precio: 6,50 €

EditorPaco Marín ([email protected])

Redactor jefeMarino Posadas([email protected])

RedacciónAlberto Población, Guillermo 'Guille' Som, LuisFraile, Luis Miguel Blanco, Miguel Jiménez yMiguel Katrib (Grupo Weboo)

Empresas colaboradoras

Alhambra-Eidos

Krasis

Plain Concepts

Raona

Solid Quality Mentors

Además colaboran en este númeroCésar de la Torre, Guillermo de la Torre,Isabel Gómez, Octavio Hernández y UnaiZorrilla.

Diseño y maquetaciónSilvia Gil (Letra Norte)

Atención al suscriptorPilar Pérez ([email protected])

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528522 - Rivas Vaciamadrid (Madrid)

www.dotnetmania.com

Tf. (34) 91 666 74 77Fax (34) 91 499 13 64

ImprimeGráficas MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

dotNetManíadotNetManía

Paco Marín

dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 3 - (desvan)

Page 4: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

sumario 58Eventos 10-13

MIX 2009 y Global MVP Summit

Especial Entity Framework 14-15Pasados varios meses desde la aparición oficial de este innovador marco de trabajo como parte de.NET Framework 3.5 SP1 y Visual Studio 2008 SP1, y una vez que numerosas empresas hancomenzado a utilizarlo y que ha aparecido abundante documentación sobre él, pensamos que unejemplar así sería de utilidad a todos los lectores.

Entrevista a Danny Simmons y Diego Vega 16-19El pasado 3 de marzo, en el marco del Microsoft MVP Summit 2009, nuestros colaboradores UnaiZorrilla y Octavio Hernández tuvieron la oportunidad de entrevistar a Danny Simmons y DiegoVega, Dev Manager y Program Manager, respectivamente, del equipo que desarrolla EntityFramework en Microsoft.

Presente y futuro de ADO.NET Entity Framework 20-24La primera versión de Entity Framework, que apareció junto con Visual Studio 2008 SP1, veníaprovista de capacidades muy potentes, tanto a nivel de herramientas (diseñador visual, generador decódigo, etc.) como a nivel del entorno de ejecución (Entity Client, Servicios de objetos, LINQ toEntities, etc.), tal y como hemos visto en artículos anteriores. En la próxima versión de EntityFramework y de Visual Studio se van a incluir nuevas características que van a implicar mejorasnotables en productividad, en extensibilidad y en flexibilidad. A lo largo de este artículo vamos apresentar algunas de ellas.

Manipulación de datos en Silverlight mediante ADO.NET Data Services (I) 26-30La evolución en el desarrollo de aplicaciones Web hacia modelos en los que la parte cliente (AJAX,Silverlight) está dotada de una mayor inteligencia y programabilidad está propiciando que laarquitectura de estas aplicaciones se base, cada vez más, en servicios, fundamentalmente en lorelativo a las operaciones de acceso y manipulación de las fuentes de datos utilizadas por laaplicación.

Consulta de modelos conceptuales con Entity SQL (III) Los métodos de construcción de consultas 32-35

Este mes dedicamos esta columna a los métodos de construcción de consultas de los Servicios de objetos deEntity Framework, un tema que se tocó muy ligeramente en la primera entrega y que puede ser muyútil a la hora de implementar consultas parametrizadas y dinámicas sobre modelos conceptuales.

Implementación de un Membership Provider basada en ADO.NET Entity Framework 36-44En este artículo se analiza SqlMembershipProvider, el proveedor de membresía (pertenencia) deASP.NET para SQL Server, y se propone una implementación funcionalmente similar a la de esteproveedor, pero basada en ADO.NET Entity Framework.

Entity Framework en aplicaciones con arquitectura N-Tier y N-Layer 46-52ADO.NET Entity Framework, que es parte de .NET Framework a partir de la versión 3.5 SP1,es una plataforma de acceso a datos que hace transparente para el desarrollador el sistema gestor debases de datos al que ataca (SQL Server, Oracle, etc.). El objetivo de este artículo es muy práctico:responder a la pregunta ¿cómo podemos utilizar Entity Framework en aplicaciones conarquitectura N-Tier o N-Layer?

dnm.q&a 53-56Herencia de controles en Windows Forms

dnm.biblioteca.net 57Programming Entity Framework de Julia Lerman (O'Reilly Media)Professional ADO.NET 3.5 with LINQ and the Entity Framework de Roger Jennings (Wrox)

dnm.desvan 58

dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 4 - (desvan)

Page 5: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 5 - (desvan)

Page 6: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

6

noticiasnot

icia

s not

icia

s not

icia

s not

icia

s

En el marco del MIX ‘09 celebradorecientemente en Las Vegas, Micro-soft anunció un conjunto de nuevasinversiones para ayudar a las empre-sas a relacionarse con sus clientes deuna manera más eficiente a través deuna presencia en la Web más rica einteractiva. Entre las nuevas herra-mientas anunciadas destacan Micro-soft Silverlight 3 Beta y Expres-sion Blend 3 Preview, así como unaactualización a la plataforma de ser-vicios de Windows Azure para eldesarrollo en la nube. Un anuncioimportante fue la elección de Silver-light por parte de la empresa NBCUniversal para ofrecer los próximosJuegos olímpicos de invierno, a cele-brarse en Vancouver, a través de susitio Web, NBCOlympics.com.

Novedades en Silverlight 3 BetaSilverlight 3 potencia a los desarro-lladores Web para crear las mejoresexperiencias posibles para sus clien-tes a través del desarrollo de aplica-ciones Web de última generación.Silverlight 3 ayuda a crear aplicacio-nes RIA (Rich Internet Applications),permitiendo trabajar más rápida-mente con nuevas características grá-ficas, de animación y 3D, y más de60 controles. Silverlight 3 tambiénpromueve una nueva generación deexperiencias relacionadas con elvídeo, a través del uso de vídeo dealta definición a pantalla completa,en directo y bajo demanda, y nuevasopciones de formato, incluyendoH.264. Otra novedad importante esdeep linking, característica orienta-da a mejorar la navegación por elcontenido Silverlight y automatizarlas tareas de optimización de moto-res de búsqueda. Finalmente, Silver-light 3 permite a los desarrolladorescrear experiencias de aplicacionesWeb ligeras fuera del navegador, loque permitirá a los sitios Web esta-

blecer relaciones más persistentescon sus clientes.

Novedades en Expression Blend 3PreviewMicrosoft también presentó una ver-sión preliminar de Expression Blend3, diseñada para mejorar drástica-mente la productividad y los flujosde trabajo entre diseñadores y desa-rrolladores. Durante el evento,Microsoft mostró SketchFlow, unanueva característica que permitirá alos diseñadores hacer prototipos rápi-dos del flujo y la composición de apli-caciones. Por primera vez, los diseña-dores podrán recibir feedback anota-do directamente sobre sus prototi-pos, e iterar rápidamente desde elconcepto hasta su implementaciónfinal. Adicionalmente, ExpressionBlend soporta directamente laimportación de archivos de AdobePhotoshop e Illustrator, la integra-ción directa de datos de ejemplo y unconjunto completo de comporta-mientos ricos.

Acceso más fácil a herramientas,plataformas y aplicaciones

Microsoft también liberó durante elevento diversos componentes de laPlataforma Web de Microsoft, unconjunto integrado de herramientas,servidores y marcos de desarrollo quefuncionan conjuntamente e intero-peran con aplicaciones y productosopen source utilizados por la comuni-dad. Parte de esta plataforma es WebPlatform Installer 2.0 Beta, unaherramienta que simplifica la insta-lación y actualización de los produc-tos para la Web y otros componen-

tes Web gratuitos de Microsoft. Estaversión permite a los usuarios des-cargar tanto PHP como la versiónfinal de ASP.NET MVC 1.0. Micro-soft también lanzó Windows WebApplication Gallery, que permite alos desarrolladores descubrir, explo-rar y descargar aplicaciones y com-ponentes que les ayuden a crear apli-caciones Web. Los desarrolladorespueden subir a esta galería aplicacio-nes gratuitas, lo que les dará la posi-bilidad de conectar con millones deotros desarrolladores Web y promo-ver sus soluciones. Asimismo, lagalería incluye enlaces a aplicacionespopulares, como Drupal, DotNet-Nuke y WordPress. Finalmente,Microsoft también anunció la dispo-nibilidad de Microsoft CommerceServer 2009, que permite a los nego-cios crear experiencias de comercioelectrónico mejoradas.

Aumentando las inversiones en lanube con la Plataforma de serviciosde Azure

Además de las inversiones destina-das a mejorar las experiencias deinterfaz de usuario, Microsoft pre-sentó sus inversiones en la platafor-ma de back-end, a través de las actua-lizaciones a la plataforma de servi-cios Azure. Durante el evento se pre-sentaron nuevas posibilidades enWindows Azure, incluyendo elsoporte de confianza total paraaumentar el nivel de flexibilidad paralos desarrolladores mediante la posi-bilidad de acceder al código nativo outilizar lenguajes no-.NET a travésde FastCGI, y el aprovechamientode la geolocalización para alojar datosy código a lo largo de diferentes cen-tros de datos, lo que permitirá a lasempresas asegurar la continuidad delservicio y mejorar el rendimientogracias a una menor latencia.

Microsoft desvela nueva tecnologías para la Web en MIX '09

dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 6 - (desvan)

Page 7: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

7

dnm.directo.noticias<<

Microsoft ha anunciado cómo los desa-rrolladores pueden diseñar y vender susnuevas aplicaciones para teléfonos Win-dows –los novedosos teléfonos conWindows Mobile 6.5 y los nuevos ser-vicios móviles de Microsoft– a través desu tienda online de aplicaciones Win-dows Marketplace for Mobile.

Todos los desarrolladores de aplica-ciones para teléfonos Windows que dis-tribuyan sus programas a través de Mar-ketplace obtendrán el 70% de los benefi-cios de las ventas. Para colocar sus aplica-ciones en Marketplace, los desarrollado-

res tendrán que abonar una suscripciónanual de 99 dólares que les dará derechoa subir hasta cinco aplicaciones. Cada apli-cación adicional que se quiera subir duran-te ese mismo periodo de tiempo costaráotros 99 dólares. La suscripción será gra-tuita para los desarrolladores que seanestudiantes y que formen parte del pro-grama DreamSpark.

Con Windows Marketplace forMobile, que estará disponible en 29 paí-ses, los desarrolladores dispondrán deuna amplia base de clientes internacio-nales. Además, Microsoft va a trabajar de

manera ininterrumpida con los desarro-lladores para asegurarse de que todas lasaplicaciones que estén disponibles enMarketplace funcionen perfectamentecon los nuevos teléfonos Windows y deque hayan pasado un riguroso control decertificación y un proceso de prueba. Losdesarrolladores tendrán acceso a todoslos detalles sobre el registro de sus apli-caciones en la tienda online durante estapróxima primavera y podrán comenzara subirlas en verano.

Para más información, visite el sitio:http://developer.windowsmobile.com.

Microsoft desvela su estrategia para los desarrolladores para lapróxima generación de teléfonos Windows

También en el marco de MIX '09, Micro-soft anunció la disponibilidad global deWindows Internet Explorer 8, que ofre-ce un rendimiento superior, herramien-tas de desarrollo Web que harán posibleexperiencias de navegador mejoradas, ygran seguridad y fiabilidad. En su pre-sentación del producto, Dean Hacha-movitch, responsable del equipo que lodesarrolló, mostró soluciones de partnerscomo ESPN, eBay o Facebook que cre-an nuevo valor para sus clientes.

Nuevas oportunidades para los desa-rrolladoresLos desarrolladores se beneficiarán de lasnuevas características de rendimiento quepermitirán a usuarios de los sitios Webacceder mucho mejor a los contenidos.Los aceleradores y web slices facilitarán alos desarrolladores ir más allá de la pági-na y ofrecer nuevas vías para que la gen-te se mantenga conectada a los conteni-dos y servicios de su elección. InternetExplorer 8 ofrece capacidades de bús-queda mejoradas y otras posibilidades paraofrecer contenido más relevante e intere-sante, mayor velocidad de navegación, yuna mejor seguridad y fiabilidad.

Compromiso con los estándares yherramientas integradasInternet Explorer 8 es el navegador deMicrosoft que cumple más cabalmente

con los estándares hasta el momento, yaprovecha el trabajo conjunto de Micro-soft con los organismos de estandariza-ción para una mayor consistencia. Comoparte del compromiso de Microsoft de darsoporte a los estándares, la empresa enviómás de 7.000 escenarios de pruebas deCSS 2.1 al consorcio W3C durante el añopasado para ayudar a una adopción mássencilla y medible para todos los desarro-lladores. Además, Internet Explorer 8 pasamás casos de prueba de CSS 2.1 queningún otro navegador, y ha invertidorecursos significativos en el soporte paraHTML 5. El funcionamiento por defec-to en modo compatible con los estánda-res y la existencia de una Vista de compa-tibilidad para facilitar la transición per-mitirán a los desarrolladores asegurarsede que su código funciona en múltiplesplataformas y navegadores. Finalmente,mediante la incorporación de InternetExplorer Developer Toolbar directamenteen Internet Explorer 8, Microsoft permi-tirá a los desarrolladores depurar fácil-mente HTML, CSS y JavaScript. Estascapacidades mejoradas potenciarán a losdesarrolladores para ofrecer mejores expe-riencias Web a sus clientes.

Para obtener más información y des-cargar Internet Explorer 8, visitehttp://www.microsoft.com/ie8. Encontrarámás información relacionada con el desa-rrollo en http://www.msdn.microsoft.com/ie.

Internet Explorer 8 ofrece nuevas posi-bilidades a los desarrolladores Web

Microsoft Surface llega aEspaña

Microsoft Surface es un dispositivo quepertenece a una nueva categoría quesupone el paso de las interfaces gráfi-cas a las interfaces naturales de usuario.

Para dotarle de contenido y apli-caciones, se cuenta con el aporte de unrobusto ecosistema de desarrolladoresy partners. Más de 120 partners en 11países diferentes ofrecen actualmenteo están ideando nuevas aplicacionespara Microsoft Surface. En España,empresas como Plain Concepts yaestán trabajando en el desarrollo deaplicaciones para este dispositivo.

Como explica María Garaña, pre-sidenta de Microsoft Ibérica, “Surfacees una categoría completamente inno-vadora que responde a un enormeesfuerzo inversor de Microsoft y a sufirme creencia en que se está gestandoun cambio drástico en nuestra relacióncon la tecnología. Tenemos un fuertecompromiso a largo plazo con estalínea de negocio, que supone un apor-te de valor sin precedentes para ayu-dar a optimizar el negocio de nuestrosclientes con sus usuarios y contribuira que nuestros partners creen conteni-dos y soluciones de negocio rompe-doras a la vez que imposibles de desa-rrollar con otras tecnologías”.

Microsoft Surface permite interactuar conla información digital a través del tacto,gestos naturales de la mano e inclusocolocando objetos físicos sobre la pantalla

dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 7 - (desvan)

Page 8: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

8

dnm.directo.noticias<<

Microsoft Ibérica ha presentado de formaunificada sus nuevas iniciativas para tra-bajar con todas las comunidades técnicasen España. La compañía está invirtiendomucho en la creación y mantenimientode los servicios online para la comunidadde desarrolladores, y fruto de ello es elespectacular incremento experimentadopor el tráfico de MSDN en español, conun crecimiento entre el 300% y 400% delnúmero de visitas de los desarrolladoresde habla hispana. Además, un dato querefleja la calidad del contenido es el tiem-po medio de permanencia, que es de alre-dedor de 10 minutos.

Extender a otras tecnologías

PureCode

Actualmente, en el portafolio de herra-mientas de Microsoft ya empieza a habercomponentes que pueden ser usados porotras tecnologías, como por ejemplo Sil-verlight, así como a ofrecer servicios en lanube, consumibles igualmente desde otrastecnologías. Por ello, y como primera pro-puesta concreta, Microsoft presentó el por-tal Pure Code (http://msdn.microsoft.com/es-es/purecode), que ofrece a los desarrollado-res de otras tecnologías como PHP y Javala ayuda y las guías necesarias para conse-guir una mayor interoperabilidad de lasherramientas Microsoft con estos entor-nos. Pure Code es una vista a la gran can-tidad de recursos que se generan tanto enMSDN como en las comunidades de desa-rrollo, tales como vídeos, artículos, tuto-riales, cursos online gratuitos, etc.

Portal de Open Source para desarrolladores

Además, existe el portal de OpenSource de Microsoft (http://msdn.microsoft.com/es-es/opensource y http://www.micro-soft.com/opensource), dedicado tanto a losque quieren usar componentes de códi-go abierto como a los que quieren desa-rrollarlos. Para los primeros, el portalofrece ayuda para seleccionar e implan-tar componentes o soluciones comple-tas. Estos componentes provienen deMicrosoft –en CodePlex (http://www.codeplex.com) hay más de 400– y también deotros partners; para los segundos, desdeCodePlex se proporcionan diversas herra-

mientas de Microsoft que, además derepositorio, sirven para aportar herra-mientas para los que desarrollan.

Crear una experiencia más completa

MSDN Respuestas

MSDN Respuestas es un comple-mento innovador para Visual Studio, desa-rrollado desde Microsoft Ibérica, que per-mite encontrar la información que el desa-rrollador necesita mientras está trabajan-do, desde el propio entorno, e integran-do múltiples fuentes de información comola referencia de MSDN, los principalesbuscadores, sitios Web de desarrollo y lasrespuestas más populares a las consultasque realices. La gran ventaja de este add-in está en la especialización y la fiabilidadde las búsquedas en distintas fuentes. Laespecialización, porque buscará en sitioscomo en los propios foros o los sitios Webde desarrollo de mayor audiencia; la fia-bilidad se conseguirá gracias a que el sis-tema permitirá votar por las respuestasobtenidas, de manera que la propia comu-nidad mejorará los resultados, permitien-do al sistema sugerir respuestas que otrosdesarrolladores han encontrado útiles paraun problema determinado.

MSDN Respuestas requiere VisualStudio Standard o superior, en tanto quela versión Express no permite instalar add-ins; pero posiblemente se ponga en mar-cha este mismo sistema fuera de VisualStudio, a través de una página Web. Paramás información y descargas, visite el sitioWeb http://msdn.microsoft.com/es-es/msdn-respuestas.aspx.

Channel 9

Recientemente se ha puesto en mar-cha la versión en castellano del archico-nocido Channel 9 (http://channel9.msdn.com/spain), lo que se enmarca dentro delas iniciativas para la mejora de los servi-cios online a los desarrolladores. A este por-tal no solo contribuyen personas deMicrosoft, sino también algunos MVP ycolaboradores cercanos, y es una buena

forma para Microsoft para estar en con-tacto con una comunidad tan grandecomo la de los desarrolladores de hablahispana. Actualmente, podrá encontrarmás de 50 vídeos cortos con contenidosde interés para cualquier desarrollador.

Foros

Ya está disponible una nueva plata-forma para los foros, que actualmentetienen más de 800.000 usuarios regis-trados aportando contenido (a nivelmundial), con más de 3.500 mensajes aldía, y en los que Microsoft ha invertidouna buena cantidad de recursos paragarantizar que estén monitorizados,libres de spam y tráfico no deseado. Losforos son una de las vías preferidas porlos desarrolladores para dar solución amuchos de sus problemas, y con MSDNRespuestas estarán aún más accesibles.La dirección es: http://social.msdn.micro-soft.com/forums/es-es/categories.

Dar valor de negocio

Ven&Gana

El apoyo a empresas que están desa-rrollando sitios Web con tecnologías deMicrosoft consiste en subvenciones en ser-vidores Web dedicados, formación gra-tuita, soporte ilimitado gratuito, accesopreferente al software y actividades degeneración de negocio. El proyecto es localy se llama Ven & Gana. Puede consultartoda la información en: http://msdn.micro-soft.com/es-es/dd565831.aspx.

BizSpark

Para emprendedores con empresas demenos de 3 años de existencia y que esténfacturando menos de 1 millón de dólares,Microsoft ha presentado el proyecto BizS-park, un proyecto a nivel internacionalque aporta todo el software necesario paraconstruir y explotar soluciones de formagratuita. En España ya hay más de 100empresas suscritas a BizSpark. El sitioWeb es: http://www.microsoft.com/bizspark.

Puede obtener más informaciónsobre todo lo expuesto aquí en:http://www.microsoft.com/youshapeit/es/es/msdn/Home.

Servicios online de Microsoft para la comunidad dedesarrolladores

dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 8 - (desvan)

Page 9: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 9 - (desvan)

Page 10: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

En un año marcado por el futuro lanzamiento de lanueva versión de Visual Studio, la conferencia pro-metía infinidad de novedades relacionadas con lasaplicaciones ricas. Y no fue menos. La keynote del pri-mer día sació las ansias de casi todos, pues comen-zando con Bill Buxton (Microsoft Researcher y autordel libro “Sketching User Experiences“) y seguidopor Scott Guthrie, se fueron anunciando nuevas ver-siones de productos casi cada minuto. Y no fueronpocas. En primer lugar, se anunciaron los platos fuer-tes de la conferencia, que han sido sin lugar a dudasSilverlight 3, Expression Blend 3 e Internet Explo-rer 8, todos incluyendo una amplísima lista de nue-vas características, SDK asociados, documentación ycantidades de información imposibles de digerir enuna única conferencia. Otras cosas no menos impor-tantes desveladas durante esa keynote y luego presen-tadas con mayor detalle durante la conferencia fue-ron ASP.NET MVC 1.0, Microsoft Web PlatformInstaller, Microsoft Web Platform Gallery,Expression Web SuperPreview, Microsoft Trans-

MIX 2009

eventos

<<

evento

s

Es costumbre entre los devotos dela tecnología Web y la experienciade usuario marcar en sus calenda-rios una visita anual a Sin City. Noes que el juego y la lujuria sean unmal atractivo, pero es más bien laconferencia MIX lo que atrae adicho público. Durante los días 18,19 y 20 de marzo, en el ostentosohotel The Venetian de Las Vegas, secelebró la 4ª edición de la conferen-cia de interacción, diseño y tecno-logíasWeb de Microsoft.

dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 10 - (desvan)

Page 11: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

lator y una actualización de Windows Azure. Al mis-mo tiempo, un extenso showcase de partners, entre los quepodemos destacar a Netflix, KEXP y Bondi, entre otros,mostraba sus últimos avances en relación con dichas tec-nologías.

Con tanta novedad, la conferencia prometía salasabarrotadas en las sesiones de Silverlight, pero ¿queda-ba algo más que decir para la keynote del segundo día?Por supuesto. Últimamente, y siguiendo el ejemplo deotras conferencias, las keynotes de Microsoft han pasadode ser simples charlas de apertura a convertirse en dis-cursos de alto contenido inspirativo que se programanpara cada día. De esta forma, la keynote del segundo díacontaba con una de las historias más evocadoras en tor-no a User Experience que he escuchado desde hacemucho tiempo. De la mano de Scott Guthrie, DeborahAdler nos presentó el proceso creativo, centrado en usua-rios y lazos emocionales, que la guió hacia la creación deClearRX, un sistema de etiquetado y clasificación demedicamentos para la marca Target. Está claro eso quetiene más bien poco que ver con el diseño de software,pero tal y como decía Bill Buxton en su presentación, “noestamos diseñando bicicletas; diseñamos la sensación de mon-tar en bicicleta“, algo muy importante a la hora de crearproductos de software: tan importante es el producto ysu función como la manera en que será utilizado.

Con respecto a los espacios disponibles, aunque seha incrementado el número de sesiones en la conferen-cia también se han disminuido los goodies físicos típicosde la misma; por ejemplo, ya no hay masajes para los asis-tentes, pero ahora pueden jugar al ping-pong. Este añose celebró, nuevamente, un concurso de “Rock Band“,y como hito especial, se proyectó “Objectified“, el nue-vo documental de Gary Hustwit (director del aclama-do “Helvetica“), junto a una ronda de preguntas y res-puestas con el director. La fiesta de asistentes se celebróen el restaurante asiático Tao, dentro del mismo hotel,y reunió a todos los miembros de los grupos de produc-to junto a los asistentes del evento.

Bueno, pero ¿y las sesiones? Una de las únicas pegasde esta edición de MIX, en mi opinión, es que estuvomuy floja en cuanto a temas de interacción y experien-cia de usuario. A pesar de que en ambas keynotes se hizouna amplia referencia a esos temas, esto no se vio refle-jado luego en la programación de las sesiones. La char-la de Corrina Black (“User Experience Design Patternsfor Business Applications with Microsoft Silverlight 3“)y la de Peter Eckert (“Escaping Flatland in ApplicationDesign: Rich User Experiences“) fueron los principalesaportes en ese ámbito, mientras que el resto de sesionesde la conferencia estuvieron dedicados, mayoritariamente,a Silverlight, ASP.NET, ADO.NET y SQL Server Data

Services y RIA Services, como puede leer en la secciónNoticias de este mismo ejemplar.

De cualquier forma, el MIX sigue reuniendo a unpúblico ávido de tecnología y deseoso de crear las mejo-res experiencias Web posibles, inspirado en el leitmotivde la conferencia “The Next Web Now!”. Ahora solonos queda esperar hasta el MIX ‘10, a celebrarse el pró-ximo marzo de 2010, nuevamente en Las Vegas.

dotN

etM

anía

<<

11

dnm.directo.eventos<<

Texto: Miguel Jiménez

dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 11 - (desvan)

Page 12: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Durante los días 1, 2, 3 y 4 de marzo, MicrosoftCorporation celebró en Seattle el encuentro anualentre sus grupos de producto y los profesionalesindependientes galardonados con el reconocimientoMVP (Microsoft Most Valuable Professional),extendiéndolo hasta el campus de Redmond. Escurioso que en los tiempos que corren muchos deestos profesionales se decidiesen a asistir, un añomás, para obtener información privilegiada; y no

es que la economía lo haya favorecido especial-mente, pero sin duda ha sido un año bastante espe-cial para los que hemos tenido la oportunidad deformar parte de esta experiencia.

En un año marcado por las noticias de crisis yrecesión, el MVP Global Summit 2009 estuvo guia-do claramente por un énfasis en respetar el acuer-do de confidencialidad (NDA) que como “galar-donados” tenemos con la compañía. Y sin dudaalguna, este énfasis en el respeto estuvo bien res-paldado por la cantidad de información que se nosha proporcionado a todos los asistentes. Evidente-mente, estas páginas no son una reseña sobre dichasnovedades, lo que violaría dicho acuerdo, sino espa-cio para destacar las actividades que se han desa-rrollado y una posible opinión sobre la visión sobreMicrosoft de sus MVP.

El encuentro, al contrario que en ediciones ante-riores, comenzó “al revés”, algo comprensible si loevaluamos objetivamente, quedando para el últimodía la keynote con Steve Ballmer. El primer día deconferencia, domingo 1 de marzo, se celebró en elWashington State Convention Center (WSCC), y suprincipal foco fue el de unir a comunidades alrededorde los grupos de producto de una manera más infor-mal, con sesiones paralelas de MVP Leads, User

Global MVP Summit 2009

eventos

<<

evento

sdotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:15 - 12 - (desvan)

Page 13: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Group Managers, INETA y similares. Enlo que al castellano se refiere, tuvimos laoportunidad de contar con un miembrodel equipo de Oslo, Miguel Llopis, queofreció una sesión privada en nuestro idio-ma sobre esa novedosa tecnología para losMVP españoles y latinoamericanos. Undía lleno de posibilidades de networkingentre pares que permitió, además, prepa-rarse para la expedición del segundo día.

El lunes 2 de marzo, los autobusesiniciaron temprano en la mañana rutasen los hoteles del centro de Seattle parallevar a los asistentes hacia Redmond,situado algunos kilómetros al este de laciudad, y comenzar las intensas sesio-nes con los grupos de producto. Es undía curioso en el campus, pues muchosde los asistentes se desplazan al edificioque les corresponde, generalmente aldel grupo de producto relacionado consu galardón, y existe una actividad efer-vescente por todos ellos que dota de unavida y dinamismo especial a las oficinas,salas de reuniones o auditorios. No obs-tante a ello, gran parte de las sesionesdel primer día en el campus se celebra-ron en el Microsoft Conference Cen-ter, por contar éste con auditorios másgrandes. Fue en este edificio, por ejem-plo, donde tuvieron lugar las sesionesde C#, VB, ASP.NET o Silverlight.

El tercer día de la conferencia, mar-tes 3 de marzo, en lugar de ofrecer sesio-nes generales para proporcionar unavisión global, favoreció una comunica-ción mucho más directa con los gruposde producto, sesiones más específicas y

la posibilidad de asistir a pequeñas reu-niones paralelas con un reducido grupode asistentes.

Tras el gran esfuerzo dedicado a losgrupos de producto, otra exclusiva opor-tunidad de networking se presenta conla fiesta oficial del encuentro, que enesta ocasión se celebró a los pies del Spa-ce Needle, legado de la ExposiciónInternacional celebrada en la ciudad, en

la sala/museo EMP (Experience MusicProject); el tema elegido fue la música.Aderezado con un poco de comida, losasistentes tuvieron la oportunidad desubir al escenario y mostrar sus dotesinterpretativas a través de un karaokecon banda en directo. Una interesantevertiente de las jam sessions de edicionesanteriores, pues no todo el mundo escapaz de tocar un instrumento y formarparte de la experiencia. La noche, comoes costumbre en Estados Unidos, acabótemprano, y preparó el camino para undulce sueño justo antes de las keynotesde la conferencia.

Miércoles, 4 de marzo: el desayunose sirve una vez más en el WSCC y pormegafonía se anuncia la apertura de lasala principal que alojará las keynotes.Tiempo de dejar la comida y correr a bus-car un sitio privilegiado para las “sor-presas” prometidas. Tras una introduc-ción al programa MVP por parte deToby Richards, se empiezan a presen-tar novedades centradas en Windows 7,Visual Studio y todo el abanico de herra-mientas de diseño y desarrollo de la manode Mike Nash y Soma Somasegar, pero

el plato fuerte estaba por llegar. Un exci-tado Ballmer, como de costumbre, sezarandea, salta y grita por el escenariocon la intención de generar una euforiasimilar en los asistentes; y funciona, elpúblico grita a la par y sin motivo apa-rente la frase “We Love Windows 7” alas órdenes de Ballmer, para un posibleremake del anuncio “I Am A PC”. Trasofrecer la visión de la compañía, una típi-

ca ronda de preguntas con el público seconvirtió en lo mejor de toda la keynote.Quejas de los usuarios de SharePoint ypromesas de Ballmer de atajarlas perso-nalmente, publicidad de Windows HomeServer directamente sobre su cabeza ypeticiones de fotos en directo sobre elescenario fueron algunos de los aconte-cimientos que tuvieron lugar durantedicha ronda.

Tal y como comentaba al principio,no estaba muy claro si la situacióneconómica afectaría al encuentro dealguna forma, pero finalmente pareceser que únicamente el efecto se ciñó aminimizar los costes de alojamiento,emparejando a los asistentes en habita-ciones. Esperemos que la situaciónmejore para el próximo año y que, alcontrario de los rumores que corríanpor las instalaciones, disfrutemos de unaedición 2010 del MVP Global Summitcon muchas más novedades para estagran industria en la que trabajamos.

dotN

etM

anía

<<

13

dnm.directo.eventos<<

Texto y fotografíasMiguel Jiménez

dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 13 - (desvan)

Page 14: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

el surgimiento de Entity Framework (EF)ha supuesto un cambio en la forma de pensar de muchos pro-gramadores, incluso a pesar de que en su primera versiónquizás haya escenarios no cubiertos completamente. Por pri-mera vez, disponemos de forma integrada en .NET y VisualStudio de capacidades reales para empezar a pensar en guiarnuestros desarrollos por modelos de dominio, que tanto sehan popularizado a partir de los trabajos de Eric Evans yotros gigantes (cuyos consejos, por cierto, se han tenido muyen cuenta durante el desarrollo de la siguiente versión, comopodrá leer en la entrevista de este mes).

Con respecto a las herramientas integradas en VS 2008SP1, Entity Data Model (EDM) nos aporta múltiples carac-terísticas para eliminar la impedancia que los programado-res orientados a objetos sufrimos normalmente con respec-to a los modelos relacionales implementados por los profe-sionales de bases de datos. Entre las capacidades más desta-cadas del diseñador de entidades podemos destacar la posi-bilidad de modelar distintos tipos de herencia (Herencia porJerarquía, Herencia por Subtipo o Herencia por Tipo Con-creto) o la representación de las relaciones en las bases dedatos como asociaciones de clases (incluyendo el soporte deasociaciones muchos-a-muchos). Por supuesto, aún queda unpoco de camino que recorrer para soportar otros escenarioshabituales dentro de los modelos relacionales existentes hoyen día en distintas aplicaciones: aspectos como el uso de tiposcomplejos o el soporte para las claves solapadas (overlappedkeys) son capacidades que se incorporarán en las siguientesversiones. En relación con esto, en este número especial Isa-bel Gómez (Microsoft DPE) escribe un excelente artículo,“Presente y futuro de EF”, con información de primerísimamano sobre las novedades que EF incluirá en la siguienteversión de Visual Studio, que tendremos liberada no dentrode mucho. También encontrará muchas ideas al respecto enla entrevista de este mes, que nos concedieron gentilmentedos de los líderes del equipo que desarrolla la tecnología en

especialEntity Framework

<<Sin duda alguna,

Unai Zorrilla es Deve-lopment Team Leader

de Plain Concepts.MVP desde 2004,

colabora activamentecon Microsoft en

eventos de arquitecturay

desarrollo, así como engiras de productos.Autor de los libros

“Modelando procesosde negocio con

Workflow Foundation”y “ADO.NET Entity

Framework:Aplicaciones y servicios

centrados en datos”.

Bienvenidos amigos, aeste especial de dotNet-Manía sobre ADO.NETEntity Framework! Pasa-dos varios meses desdela aparición oficial deeste innovador marcode trabajo como partede .NET Framework 3.5SP1 y Visual Studio 2008SP1, y una vez quenumerosas empresashan comenzado a utili-zarlo y que ha aparecidoabundante documenta-ción sobre él (consultelas referencias al final deesta presentación), pen-samos que un ejemplarasí sería de utilidad atodos los lectores.

entity framework

Unai Zorrilla

dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 14 - (desvan)

Page 15: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Microsoft, Danny Simmons (DevManager para EF y LINQ to SQL)y Diego Vega (Program Manager deEF).

En cuanto al cambio en nuestraforma de desarrollar, EF nos permi-te incrementar de una manera sensi-ble la productividad mediante la posi-bilidad de utilizar una implementa-ción del patrón LINQ sobre losmodelos de entidades, gracias a locual nuestro trabajo se hace fuerte-mente tipado, lo que sin duda algu-na promueve una programación máseficiente y menos propensa a errores.Pero, por supuesto, EF no nos obli-ga a casarnos con LINQ to Entitiespara realizar nuestras consultas: tam-bién tenemos la posibilidad de utili-zar los tradicionales procedimientosalmacenados y de materializarautomáticamente los resultados en lasentidades definidas en el modelo, ode expresar directamente las consul-tas, por diferentes vías, medianteEntity SQL (eSQL), un subdialectode SQL agnóstico del motor de basesde datos; una de estas vías, basada enel uso de los métodos de construc-ción de consultas (eSQL Builder Met-hods), es la que exploramos en nues-tra entrega de este mes mi compañe-ro de fatigas, Octavio Hernández yyo mismo.

Por supuesto, tal y como ya hemoscomentado anteriormente, ningunaprimera versión de un producto fuecompleta, y EF no iba a ser una excep-ción a esta regla que parece inmuta-ble en el mundo del software. Lamayoría de la gente que interrogasobre esta tecnología en eventos de

divulgación, charlas de grupos deusuarios y/o procesos de formación,pone de manifiesto sus preocupacio-nes, dudas o problemas de imple-mentación en aplicaciones distribui-das, donde las entidades consultadasviajan a través de una fachada de ser-vicios. Por regla general, estas dudasson planteadas por desarrolladoresque han hecho uso anteriormente defacilidades como las que objetos comolos DataSet, con sus diffgram, ofre-cen para mantener la gestión de loscambios que sobre ellos se producen,y tienen que ver con cómo hace EFesa gestión de los cambios ocurridossobre las entidades que viajan a travésde las diferentes capas de la aplica-ción. Sobre este tema, nuestro amigoCésar de la Torre (Microsoft DPE)nos presenta aquí su artículo “EF enaplicaciones con arquitecturas N-Tiery N-Layer”, en el que presenta losposibles enfoques que podemos adop-tar e implementa completamente unode ellos.

Pero aún hay mucho más en esteespecial. Nuestros amigos al otro ladodel Atlántico, miembros del GrupoWebOO de la Universidad de LaHabana, nos presentan su implemen-tación de un proveedor de ASP.NETMembership basado íntegramente enEF, que pone a nuestra disposición unsistema de control de pertenenciacapaz de funcionar para múltiplesbases de datos. Además, nuestroredactor Luis Miguel Blanco nosofrece la primera entrega de una serieen la que mostrará cómo desarrollarclientes RIA de Silverlight que seconecten bajo demanda a la capa de

acceso a datos utilizando ADO.NETData Services, otra importante nue-va tecnología basada en EF.

Espero sinceramente que el ejem-plar que tiene en sus manos sea de suagrado.

Para finalizar, no me gustaría dejarpasar esta oportunidad para animar atodos los que aún no lo han hecho aprobar, investigar y usar EF, un mar-co de trabajo que sin duda alguna hallegado para quedarse. Comocomentábamos al principio, actual-mente ya existen numerosos recursosdisponibles en la red y se han publi-cado diversos libros, el primero deellos, “ADO.NET EF. Aplicacionesy servicios centrados en datos” [2],escrito en nuestra lengua madre porespañoles enamorados de esta tecno-logía desde sus primeras betas: Octa-vio Hernández, Eduardo Quintás yun servidor.

dotN

etM

anía

<<

15

dnm.entityframework<<

Literatura sobre EF

Zorrilla, U., Hernández, O., “El Marco de Entidades de ADO.NET 3.5” (I-VII), en dotNetManía nº 44-50, enero-julio de 2008.

Zorrilla, U., Hernández, O., Quintás E., “ADO.NET Entity Framework. Aplicaciones y servicios centrados en datos”, KrasisPress, 2008 (vea presentación de Marino Posadas en dotNetManía nº 55, enero de 2009).

Lerman, J. “Programming Entity Framework”, O'Reilly, 2009 (vea presentación de Marino Posadas en este mismo ejemplar).

Jennings, R. “Professional ADO.NET 3.5 with LINQ and the Entity Framework”, Wrox Press, 2009 (vea presentación de MarinoPosadas en este mismo ejemplar).

[1]

[2]

[3]

[4]

Desde aquí le animamos a probar y usar EF,

un marco de trabajo quesin duda alguna ha llegado

para quedarse

dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 15 - (desvan)

Page 16: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Unai Zorrilla esDevelopment Team

Leader de PlainConcepts. MVP desde2004, colabora activa -

mente con Microsoft eneventos de arquitectura y

desarrollo, así como engiras de productos. Autorde los libros “Modelandoprocesos de negocio conWorkflow Foundation” y

“ADO.NET EntityFrame work: Aplicacionesy servicios centrados en

datos”.

Octavio Hernández esMVP de C# desde

2004, MCSD y MCT.Autor de los libros “C#

3.0 y LINQ" y“ADO.NET Entity

Framework: Aplicacionesy servicios centrados endatos” (con UUnai Zorrilla

y EEduardo Quintás).

entrevista

entrevista a

El pasado 3 de marzo, en el marco del Microsoft MVP Summit 2009, nuestros cola-boradores Unai Zorrilla y Octavio Hernández tuvieron la oportunidad de entrevistara Danny Simmons y Diego Vega, Dev Manager y Program Manager, respectivamente,del equipo que desarrolla Entity Framework en Microsoft.

En primer lugar, nuestro más sincero agra-decimiento por esta oportunidad de entre-vistaros para dotNetManía. Generalmente,nuestras entrevistas comienzan pidiendo alos entrevistados que se presenten breve-mente ante los lectores de la revista.

Diego Vega. Mi nombre es Diego Vega,y soy uno de los cuatro Program Manager delequipo de Entity Framework (en adelanteEF). Normalmente mi trabajo se relacionacon los Servicios de objetos (Object Services)

y LINQ to Entities, y ocasionalmente tam-bién con LINQ to SQL.

Danny Simmons. Yo soy Danny Simmons,Dev Manager del equipo que se encarga tantode EF como de LINQ to SQL, y trabajo enMicrosoft desde hace unos 12 años.

¿Y en qué proyectos trabajaste antes?Danny. Bueno, es una lista bastante larga.

Empecé trabajando en el desarrollo de Outlo-ok, luego en otro proyecto relacionado con

Unai Zorrilla, Octavio Hernández

Danny Simmons y Diego Vega

dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 16 - (desvan)

Page 17: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Office que nunca vio la luz, pero quesentó las bases para lo que hoy es Info-Path, más adelante en Live Meeting,y también estuve un tiempo en Micro-soft Business Solutions. Pero ya llevomás tiempo en este equipo del quenunca estuve en un mismo puestoanteriormente.

Queríamos felicitaros por el traba-jo realizado con EF, que ha sido ins-pirador para muchos en la comuni-dad española de desarrolladores porel nuevo nivel al que eleva el desa-rrollo de aplicaciones centradas endatos, y que nos ha dejado expec-tantes de las posibilidades que seañadirán en la siguiente versión.Hemos seguido la iniciativa relacio-nada con el blog "EF Design", yqueríamos preguntaros qué resulta-dos ha producido.

Danny. El blog "EF Design" hasido un gran ejercicio para todos noso-tros, tanto desde el punto de vista dehacernos reflexionar sobre las cosas quediseñamos de un modo diferente, en elsentido de permitirnos compartir lasideas por adelantado y estar en contac-to con la comunidad, como desde otrospuntos de vista sobre los cuales hemosrecibido un excelente feedback. Porejemplo, cuando liberamos por prime-ra vez en el blog nuestras ideas y pro-puestas de API sobre el desarrollo enN capas, recibimos muchas sugerenciassobre la importancia de poder disponerde entidades con auto-seguimiento (selftracking entities); de manera similar, haymuchos otros casos en los que hemosintroducido cambios positivos en elproducto como respuesta a la actividaden ese blog. Lo otro que podría deciral respecto es que durante mucho tiem-po hemos intentado estar lo más cercaposible de la comunidad, porque haymucha gente con gran experiencia eneste espacio y con diferentes puntos devista sobre las maneras óptimas deactuar en diferentes escenarios, dife-rentes enfoques del mapeo objeto-rela-cional, y de quienes indudablementepodemos aprender mucho. Indudable-

mente, esta retroalimentación es unejercicio muy saludable, incluso en loscasos en que las ideas divergen sensi-blemente de las nuestras.

Diego. Me gustaría agregar que nosiempre es fácil priorizar las diferen-tes tareas a acometer con vistas a pasara la siguiente versión, y el feedback queobtenemos nos ayuda en gran medidaa detectar cuáles son los principalesaspectos problemáticos cuya soluciónes necesario priorizar. Desde aquí que-remos estimular a toda la comunidada seguir enviándonos sus sugerencias,que tienen en nosotros una influenciamucho mayor de la que seguramentesospechan. Mi trabajo como ProgramManager se hace mucho más fácil gra-cias al aporte de la comunidad.

¿Qué podéis decirnos del aporterecibido de las personalidades queforman parte del llamado Consejoasesor, como Jimmy Nilsson o Mar-tin Fowler?

Danny. Hemos tenido discusionessumamente productivas con los miem-bros del consejo, tanto con Nilsson yFowler como con Eric Evans, Step-hen Forte y Pavel Hruby. Por ejem-plo, recientemente el equipo ha teni-do un diálogo muy útil con Jimmy quenos ha aportado varias puntualizacio-nes importantes. En general, creo quealgo muy positivo acerca de estas con-versaciones fue el hecho de que nohubiera grandes sorpresas como resul-tado de ellas; ya contábamos connumerosos aportes de las comunida-des a la que ellos representan, y había-mos oído muchas de las sugerenciasque nos hicieron. Pero indudable-mente, muchas de las ideas que ya nosrondaban se profundizaron y pulierongracias a ellos, y además nos han dadootras perspectivas nuevas. En general,creo que hemos completado bastanteel producto con estas ideas, y cuandoahora un miembro de la comunidad senos acerca con una solicitud, general-mente se trata de que necesita que leofrezcamos más rápidamente algo queya tenemos en nuestra lista de cosas

pendientes. El problema es que EF esun producto grande, y las cosas tardancierto tiempo en implementarse.

En lo que respecta al desarrollo deaplicaciones centradas en datos,podríamos clasificar a los desarrolla-dores en dos grupos: los que intentanbasarse más en un modelo conceptualy los que por una razón u otra obviano minimizan ese proceso para cen-trarse directamente en los procesosde manipulación de datos que sus apli-caciones requieren. ¿Cómo podrá ayu-dar a ambas clases de desarrolladoresla próxima versión de EF?

Danny. Buena pregunta. General-mente, yo intento dividir a los desa-rrolladores en varias categorías más, yno solo las dos que mencionas. En par-ticular, añadiría un tercer grupo. Porun lado están, como dices, quienesintentan basarse en modelos concep-tuales, y más concretamente en mode-los de dominio; estos a la misma vezestán muy centrados en el código yquieren tener un control total sobre él;para ellos son muy importantes cosascomo Code First, POCO (Plain OldCLR Objects), etc., y tienden a ser"puristas" en lo relativo a la arquitec-tura. En el medio, hay un segundo gru-po de desarrolladores a quienes les gus-ta en principio disponer de las carac-terísticas que ofrece EF, como elmapeo, etc., pero que están muy enfo-cados hacia una máxima productividady lo que buscan del producto es prin-cipalmente una experiencia de herra-mientas y servicios que les permitahacer de una manera casi automáticalo que hacían, por ejemplo, con data-sets en versiones anteriores de .NET.Por último, está el grupo de gente queno está interesada en estas abstraccio-nes y prefiere interactuar directamen-te con la base de datos. A estos últimos,no es mucho lo que EF les puede apor-tar; ciertamente, podrían crear mode-los básicos, uno-a-uno, y utilizarlos convistas a obtener un acceso fuertemen-te tipado a los datos, pero eso es lo mis-mo que obtendrían con LINQ to SQL

dotN

etM

anía

<<

17

dnm.directo.entrevista<<

dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 17 - (desvan)

Page 18: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

18

dnm.directo.entrevista<<

o datasets tipados, y si realmente nece-sitan o simplemente desean un alto ren-dimiento probablemente preferirántrabajar directamente a más bajo nivel(DbDataReader, etc.) contra la base dedatos. Creo que el grupo intermedio,el de los que quieren tener las abstrac-ciones pero a la vez ser muy producti-vos, es el segmento en el que tenemosmayores oportunidades, porque lo queEF y sus herramientas asociadas lespermitirán es ser muy productivos a lavez que crear algo que sea arquitectó-nicamente sólido y muy cercano a loque se querría obtener si se desarrolla-ra todo ese código manualmente a lolargo del tiempo. Porque, indudable-mente, uno de los mayores peligros quehan tenido otros enfoques anterioresdel acceso a datos basados en progra-mación visual, drag & drop y cosas asíes que la aplicación comienza siendomanejable, pero a lo largo del tiempose va convirtiendo en un pasticheinmantenible, que en cierto momentose hace necesario tirar para empezar denuevo. Que es, por cierto, la vía a travésde la cual muchos de los desarrollado-res de este grupo intermedio se pasa-ron al primero: empezaron usando esastecnologías, pero se frustraron y aho-ra intentan ser muy cuidadosos. Noobstante, sigue habiendo una cantidadconsiderable de desarrolladores en esegrupo intermedio, además de la afluen-cia a él de nuevos desarrolladores, y loque intentamos hacer es que puedanalcanzar ese punto ideal en el queobtengan una alta productividad evi-tando totalmente a su vez el engorroarquitectónico por debajo.

Diego. Estamos trabajando muchoen lo relativo a intentar encontrar lasabstracciones adecuadas sobre las basesadecuadas, y pienso que hemos hechograndes progresos a ese respecto convistas a la próxima versión. La con-clusión clave es que una cosa no tienepor qué estar en contradicción con laotra: la corrección en la arquitecturano tiene necesariamente que estar reñi-da con la productividad.

¿Podríais referiros brevemente a lasprincipales novedades que incorpo-rará la próxima versión de EF?

Danny. Creo estas novedades sepueden categorizar en varios temas quehan emergido claramente de todo el tra-bajo realizado a partir de la versión ini-cial. Uno de los temas engloba todo loque tiene que ver con las maneras en lasque el desarrollador puede ganar mayorcontrol sobre su código; en este grupopodemos clasificar novedades como laposibilidad de utilizar entidades POCO,la disponibilidad de opciones a la horade implementar una verdadera ignoran-cia de la persistencia (Persistence Igno-rance), la integración del lenguaje T4 enlas herramientas para permitir unamayor personalización de la generaciónde código, e incluso cosas como la incor-poración de una nueva interfaz, IOb-jectSet<T>, para facilitar en gran medi-da el mocking y las pruebas en general.Otro gran tema es el relacionado con eldesarrollo en N capas; se ha hecho unagran inversión para hacer mucho másfácil y efectivo el desarrollo de aplica-ciones de múltiples capas con EF en unaamplia gama de posibles escenarios. Untercer gran tema tiene que ver con hacermás fácil la adopción de EF para los desa-rrolladores que utilizan LINQ to SQL,incorporando toda una serie de cosas quea la gente le gusta de LINQ to SQL,como la carga implícita demorada (impli-

cit lazy loading), operadores de consultaadicionales, o una experiencia similaren el uso de las herramientas visualespara los procedimientos almacenados.Un cuarto tema es el relacionado conla manera en que trabajamos, con losfundamentos, y en este sentido hay todauna serie de lugares dentro de EF enlos que hemos trabajado para mejorartanto la utilidad y usabilidad de las APIcomo el rendimiento y la seguridad. Unpequeñísimo ejemplo de esto últimopuede ser el hecho de que el métodoObjectContext<T>.SaveChanges es aho-ra virtual, lo que permitirá a los desa-rrolladores redefinirlo para una clasede contexto determinada. ¿Algo que seme olvide, Diego?

Diego. El tema relacionado con lospartners en general. Esto tiene que vercon un cierto trabajo de “preparación”de nuestras API que estamos llevandoa cabo para facilitar la interacción deEF con otros marcos de trabajo; por-que es muy grande el valor que puedenaprovechar de EF otros productos,como por ejemplo Reporting Services,así como el que puede obtener el pro-pio EF, por ejemplo, de la utilizaciónde las inversiones que se vienen reali-zando en Oslo.

Danny. Adicionalmente, más alláde lo relacionado con EF en sí, hemosestado trabajando internamente en víaspara mejorar nuestra velocidad de res-puesta a las necesidades de los desarro-lladores; en particular, para poder sumi-nistrarles valor de una manera incre-mental en ciertas circunstancias a unritmo más rápido que el que ofrecen lasversiones de .NET Framework y VisualStudio, pero siendo aún parte integralde .NET Framework. Tenemos algu-nos planes al respecto, que comunica-remos próximamente.

Con tantos cambios y adicionesimportantes, no nos quedará otroremedio que escribir un nuevo libro(risas).

Danny. Efectivamente, ésta va a seruna actualización muy significativa de EF.

Entity Framework permitiráa los desarrolladores sermuy productivos a la vez

que crear software arquitectónicamente sólido

dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 18 - (desvan)

Page 19: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

19

dnm.directo.entrevista<<

Habéis mencionado LINQ to SQL.¿Podríais dejar claro a nuestros lec-tores cuál es la política oficial de laempresa acerca de este marco detrabajo?

Danny. Este es un tema sobre el quesabemos que se habla mucho. Es muyimportante que la comunidad sepa queLINQ to SQL no va a ser depreciado(deprecated), abandonado, ni nada por elestilo. Es una parte integral de .NETFramework y lo seguirá siendo; ningu-na parte de .NET Framework desapa-rece de un día para otro. Y tampoco esnuestra intención que lo haga: quere-mos seguir dando soporte a los clientesque utilizan LINQ to SQL. Al mismotiempo, como hemos dicho en otrosfórums, EF es el marco de trabajo en elque estamos haciendo las inversionesestratégicas, por lo que la cantidad denuevas funcionalidades que se incorpo-rarán a EF es muy superior a la de lasque se incorporarán a LINQ to SQL.Es un tema de prioridades a la hora dedistribuir nuestros recursos. Pero tam-bién está un poco en correspondenciacon lo que LINQ to SQL pretende ser:un marco de trabajo sencillo y fácil deusar, basado en un mapeo uno-a-uno dela base de datos, y específico para SQLServer. Añadiéndole muchas nuevascaracterísticas a LINQ to SQL, podría-mos estar perdiendo aquello que lo haceuna gran herramienta para sus usuarios,y eso tampoco lo queremos.

¿Cuáles son las diferencias princi-pales entre los objetos POCO y losDTO (Data Transfer Objects) tradi-cionales?

Diego. A diferencia de los DTO tra-dicionales, a los que no se les supone uncomportamiento asociado, los objetosPOCO generalmente sí lo tienen.

Danny. Por ejemplo, uno podríaquerer tener diferentes conjuntos decomportamientos en la capa cliente y enla capa intermedia. Podría haber unascuantas reglas de validación comunes aambas capas, pero otra cantidad de cosasque se quisieran gestionar de manera

diferente, en particular cuando las enti-dades se hacen inteligentes. Algunosdirán que se podría incluir ese mínimode validación en las entidades, e imple-mentar todo lo demás en servicios exter-nos, pero otros, y específicamente lospracticantes de DDD (Domain DrivenDesign), prefieren hacer sus entidadesmuy inteligentes, que incluyan toda lalógica necesaria. Concretamente, JimmyNilsson recomienda construir un mode-lo de dominio para la capa intermediay un modelo de dominio diferente parael cliente, porque los objetivos son dife-rentes, y enviar mensajes entre ellos. Porotra parte, un caso en el que yo reco-mendaría usar DTO es cuando existe loque yo llamaría distintas frecuencias decambio: cuando la frecuencia de cam-bio de mi modelo de dominio es dife-rente de la frecuencia de cambio delcontrato de mi servicio. Por ejemplo, sicomparto el servicio con un partner yno puedo controlar cuándo hace cam-bios en su código, pero no quiero tenerque esperar por esos cambios para podermodificar mi modelo. Aunque tal vez enaquellos casos en que uno controlaambas capas (Silverlight es un granejemplo de esto –tengo mi capa inter-media y un cliente que se despliega cadavez que alguien lo ejecuta–), puede queno sea tan interesante tener clases dife-rentes; se podría tener objetos POCOcompartidos en ambas capas, y esa seríauna forma productiva y eficiente de tra-bajar para el desarrollador. La decisiónde diseño depende, entonces, de si secontrolan ambas capas y de las frecuen-cias con que las cosas cambian, ademásde, por supuesto, la lógica concreta.

En el caso de las entidades con auto-seguimiento, que hacen un segui-miento de sus propios cambios, ¿oshabéis basado de alguna manera enun patrón similar a Active Record?

Danny. Sí y no. Para la mayoría dela gente, el patrón Active Record está máscerca de lo que hace LINQ to SQL(mapeo uno-a-uno de las entidades con labase de datos, entidades muy parecidas

a las tablas de la base de datos, y luegopuede que construyamos objetos dedominio que se conectan a las entidades).Podría establecerse una similitud entreesto y las entidades con auto-seguimien-to en el sentido de que son segundas enti-dades que se parecen a las del modeloconceptual, pero, debido a que en EDMdisponemos de la herencia y demás carac-terísticas avanzadas que conocemos,aquellas no se parecerán mucho a lastablas de la base de datos; eso hace quelas entidades con auto-seguimiento separezcan menos al patrón Active Record.

Cuando aparecieron las primerasbetas de EF, pensamos que EDM ibaa ser una parte integral de práctica-mente todas las tecnologías de acce-so a datos de Microsoft, comoReporting Services, Business Inte-lligence, o incluso el Business Cata-log de SharePoint. ¿Cómo está posi-cionado EF con respecto a otras tec-nologías de la empresa como lasantes mencionadas?

Danny. Como ya mencionó antesDiego, hemos establecido conexionescon la mayoría de esos equipos, y en lavisión de nuestra división de desarrolloEDM sigue siendo un posible factor uni-ficador de todas esas diferentes tecno-logías. El problema es que todas esas tec-nologías constituyen productos estable-cidos, con una base de clientes existen-te, imposibilidad de hacer cambios querompan la compatibilidad, etc. Así quese trata de un proceso lento. Con el queestamos comprometidos y en el queseguimos invirtiendo, pero lento. En losúltimos tiempos hemos hecho un grantrabajo de integración con ReportingServices, cuyos resultados se verán en unfuturo próximo; y hemos empezado atrabajar con otros grupos del equipo deSQL Server en ideas como incorporarEDM al catálogo del motor de bases dedatos, entre otras. E interacciones simi-lares las estamos llevando a cabo con losequipos de SharePoint, Master DataManagement, el equipo de WorkflowFoundation y otros.

dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 19 - (desvan)

Page 20: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Para una mejor comprensión, hemos dividido lascaracterísticas sobre las que vamos a hablar en dosgrupos. Primero nos centraremos en las nuevas posi-bilidades asociadas a las herramientas de diseño incor-poradas al entorno de desarrollo, para más adelanteocuparnos de las nuevas funcionalidades que nos ofre-cerán las API que tendremos a nuestra disposición.

El futuro de las herramientas de EntityFramework

Una de las mejoras más potentes relacionadas con eldiseñador visual que estará incluida en Visual Studio2010 es la posibilidad de personalizar fácilmente el códi-go generado a partir del CSDL (definición del modeloconceptual) a través de plantillas personalizadas, par-tiendo si queremos de una serie de plantillas predefini-das que estarán "de serie" a nuestra disposición.

El generador de código por defecto de Entity Fra-mework (en adelante EF) (EntityClassGenerator) es elencargado de crear, a partir del fichero CSDL (con-tenido dentro del fichero EDMX generado por VisualStudio), el código con las correspondientes clases.NET que representarán nuestras entidades y las aso-ciaciones entre las mismas, clases que actualmentequedan incluidas dentro de un fichero .Designer.cs o.Designer.vb.

En la práctica, muy frecuentemente nos vemos enla necesidad de modificar el código generado para adap-tarlo a nuestras necesidades. Algunos ejemplos frecuentesson marcar entidades o propiedades con atributos per-sonalizados, implementar determinadas interfaces pro-pias, etc. La forma de personalizar el código generado

Presente y futuro de ADO.NETEntity Framework

entity framework

Isabel Gómez Miragayaes Evangelista deDesarrollo para

fabricantes de softwa-re en Microsoft.

Guía y asesora a losISV en arquitectura y

desarrollo con nuevastecnologías.

La primera versión de Entity Framework, que apareció junto con Visual Studio2008 SP1, venía provista de capacidades muy potentes, tanto a nivel de herra-mientas (diseñador visual, generador de código, etc.) como a nivel del entornode ejecución (Entity Client, Servicios de objetos, LINQ to Entities, etc.), tal ycomo hemos visto en artículos anteriores [1]. En la próxima versión de EntityFramework y de Visual Studio se van a incluir nuevas características que van aimplicar mejoras notables en productividad, en extensibilidad y en flexibilidad. Alo largo de este artículo vamos a presentar algunas de ellas.

Isabel Gómez Miragaya

Isabel Gómez ha donado los dere-chos de autor de este artículo a laONG Namaste, que busca mejorar

la calidad de vida de los niños que habitan lugares con unentorno difícil. Desde Namaste se buscan soluciones loca-les a problemas locales, trabajando con organizacionesde cada país. Así, además de proporcionar los cuidadosnecesarios para el crecimiento de los niños, Namasteofrece programas educativos adaptados a las necesida-des de los niños de cada zona. Si está interesado en losproyectos de esta ONG o quiere ayudarles en su laborcon estos niños, visite http://www.namasteong.es.Tam-bién puede colaborar a través de la iniciativa “Un Clicsolidario” en http://www.unclicsolidario.com.

Firma solidaria

dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 20 - (desvan)

Page 21: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

21

dnm.entityframework<<

en la primera versión de EF pasaba por utilizar el meca-nismo de extensibilidad estándar del SingleFileGenera-tor, lo cual resulta bastante tedioso y problemático, espe-cialmente a la hora de personalizar o depurar.

En Visual Studio 2010 se abre la posibilidad de usarplantillas de T4 para personalizar la generación de códi-go y que además la experiencia esté totalmente integra-da con el diseñador de entidades. T4, o mejor dicho, el“Text Template Transformation Toolkit”, es un motorde generación de código basado en plantillas. Está inclui-do con Visual Studio 2008 y Visual Studio 2010 (y esdescargable para Visual Studio 2005 como parte de lostoolkits de DSL y de GAT). Este motor puede usarse paragenerar código en C#, Visual Basic, T-SQL, XML opara generar cualquier fichero de texto como informeso páginas HTML. El mecanismo es sencillo: a partir dedatos de entrada y la plantilla correspondiente (un archi-vo con extensión .tt conteniendo bloques de texto ylógica de control con una filosofía muy similar a ASP ocualquier lenguaje de macros), se genera el fichero o losficheros resultantes.

La forma de trabajar sería la siguiente. Selecciona-mos el EDMX para el que queremos personalizar elcódigo y añadimos al proyecto un nuevo elemento deGeneración de Artefactos, concretamente el“ADO.NET EntityObject Generator”. Esto hará quese elimine el código generado por defecto (.Designer.cso .Designer.vb) y se abra la plantilla .tt predetermina-da. El desarrollador podrá modificar este fichero para

aplicar las personalizaciones que desee. Visual Studio seencargará entonces de generar el correspondiente fiche-ro de código a partir de esta plantilla. En la figura 1 pode-mos ver un ejemplo de personalización de la plantilla,en el que hemos especificado que la clase de contextoimplemente una interfaz IValidate.

Esta capacidad permitirá que el equipo de EF pue-da, por ejemplo, liberar nuevas plantillas T4 fuera delos ciclos de salida de Visual Studio y de .NET connuevas capacidades o correcciones. Pero no solo eso:

Figura 1. Plantilla T4 modificada (pantallazo de Clarius T4 Editor Community Edition for VS 2008)

En Visual Studio 2010 se abre la posibilidad de usar plantillas de

T4 para personalizar la generación de código a partir de

modelos de entidades

dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 21 - (desvan)

Page 22: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

22

dnm.entityframework<<

abrirá nuevas posibilidades hasta ahora no contem-pladas, como la posibilidad de crear plantillas que seintegren con Visual Studio a través de la API EnvD-TE para generar nuevos ficheros de proyecto o gene-rar documentación HTML con las características denuestro modelo conceptual. Podremos incluso empa-quetar estas plantillas T4 en plantillas de elementosde proyecto de Visual Studio para que los usen losmiembros de un equipo de desarrollo. Este mecanis-mo proporciona una vía fácil y potente de extensibi-lidad y personalización.

La próxima versión de EF usa T4 no solo para lageneración de código, sino también para hacer posiblela utilización en nuestros desarrollos de una filosofía Elmodelo primero (Model First), sin duda una de las carac-terísticas más demandadas por la comunidad. En la pri-mera versión de EF, es necesario partir del esquema rela-cional de una base de datos para poder definir y mape-ar un modelo conceptual. Al añadir un nuevo modelode EF a nuestro proyecto, tenemos que especificarmediante un asistente la base de datos sobre la que que-remos definir nuestro modelo conceptual. Se trata, portanto, de un diseño El esquema primero (Schema First).En Visual Studio 2010 podremos definir inicialmentenuestro modelo conceptual, con las correspondientesentidades, sus jerarquías de herencia y sus relaciones,para luego lanzar desde el menú contextual del diseña-dor un asistente que o bien creará bien ficheros inde-pendientes con las sentencias DDL (Data Definition Lan-guage) con la sintaxis correspondiente al repositorio dedatos elegido, o bien desplegará directamente el corres-pondiente esquema al servidor de base de datos elegidousando esas mismas sentencias DDL.

Por defecto, al generar las sentencias DDL se usauna solución Tabla-por-Tipo (TPT), es decir, se creauna tabla por cada tipo y subtipo. Por ejemplo, parael modelo de la figura 2, se generará el esquema quese muestra en la figura 3.

Figura 2. Modelo conceptual con herencia entre entidades

Figura 3. Modelo relacional con esquema Tabla-por-Tipo

T4 también hará posible la utilización de una filosofía

“El modelo primero”, una de lascaracterísticas más demandadas

por la comunidad

dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 22 - (desvan)

Page 23: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

23

dnm.entityframework<<

Es de señalar que la generación de las sentenciasDDL se implementa mediante un flujo de trabajo deWorkflow Foundation expresado en XAML, por loque puede sustituirse fácilmente por uno propio, totalo parcialmente, por ejemplo, para hacer uso de unesquema Tabla-por-Jerarquía (TPH) en lugar de TPT.Este hecho, como muchas de las nuevas posibilidadesen relación con la experiencia de diseño, viene a pro-porcionarnos una gran capacidad para meternos den-tro de los entresijos de la tecnología para permitirnosmodificarla y adaptarla a nuestras necesidades.

Un paso más allá de la filosofía El modelo prime-ro sería El código primero (Code First). Es decir, quepartiendo de clases definidas en .NET podamos gene-rar el correspondiente modelo conceptual de EF. Elgrupo de producto ha presentado un prototipo conesta capacidad y está estudiando diversas formas deimplementarla, aunque por ahora no es posible ase-gurar que esta característica formará parte de la pró-xima versión de Visual Studio.

Otra mejora reseñable dentro de las herramien-tas de diseño de EF para la próxima versión lo cons-tituye el soporte para los tipos complejos. Es decir,con Visual Studio 2010 se podrán crear, editar y borrartipos complejos en el navegador de modelos y usar-los en propiedades de entidades, o como tipo de retor-no de procedimientos almacenados.

Por otro lado, el mapeo de importación de fun-ciones permitirá especificar cómo se mapean los pará-metros de retorno de los procedimientos almacena-dos a las correspondientes propiedades de las entida-des o tipos complejos; en la primera versión, estemapeo era implícito y los nombres tenían que casar.

Para terminar con el conjunto de novedades den-tro del apartado de herramientas, podemos destacarun excelente soporte para la búsqueda de informacióndentro de los modelos EDM, incluyendo el resalta-do de los elementos visuales.

El futuro de EFMuchas son también las mejoras y nuevas capacida-des que se incluirán en la próxima versión de laslibrerías que componen EF. Hemos resumido algu-nas de las más destacadas a continuación; podrá encon-trar más información sobre ellas en la entrevista aDanny Simmons y Diego Vega, destacados miembrosdel equipo de EF, en este mismo ejemplar.

Como sabréis, EF implementa un patrón de diseñodenominado Carga perezosa (Lazy Loading). Esto sig-nifica que cuando realizamos una consulta sobre unconjunto de entidades, por defecto, los Servicios deobjetos no se traen las entidades relacionadas (el gra-fo correspondiente) de la base de datos. La forma de

especificar la expansión de la consulta, es decir, la inclu-sión de las entidades relacionadas en el conjunto deresultados, es mediante la utilización del método Inclu-de en la definición de la consulta, o bien mediante unallamada explícita a Load para lanzar la correspondien-te consulta a la base de datos para obtener las entida-des relacionadas. Por ejemplo, en el listado 1 especifi-camos a través de Include que deseamos obtener adi-cionalmente los productos correspondientes a las cate-gorías seleccionadas por la consulta; por otro lado, enel listado 2 la carga de los productos la hacemos bajodemanda mediante una llamada a Load.

Como puede ver, en ambos casos la carga de lasentidades relacionadas tiene que ser explícita. Si qui-siéramos abstraernos de esta necesidad y no cargar elcódigo con llamadas a IsLoaded/Load para comprobarsi las relaciones están cargadas y si no lo están hacer-lo, podríamos implementar una carga perezosa trans-parente o implícita, similar a la que ofrece LINQ toSQL. Existen varias estrategias para hacerlo, y unabuena forma de revisar las implicaciones y posibili-dades de cada una de ellas es acudir al blog de Jaros-law Kowalski [5]. Pues bien, en la próxima versiónde EF podemos contar con ello, y mediante unaopción del contexto de trabajo podremos especificarsi queremos una carga perezosa implícita.

Otra de las mejoras que incluirá la próxima ver-sión será el soporte de objetos POCO (Plain OldCLR Objects). Es decir, las clases correspondientes alas entidades del modelo no tendrán por qué derivarde EntityObject, como ocurre actualmente, de for-ma que pueda usarse el mismo modelo conceptual de

var contexto = new EntidadesNorthwind();var categorias = from c in contexto.Categorias.

Include(“Productos”)orderby c.Nombreselect c;

Listado 1. Carga perezosa mediante Include

var contexto = new EntidadesNorthwind();var categorias = from c in contexto.Categorias

orderby c.Nombreselect c;

categorias.Productos.Load();

Listado 2. Carga perezosa con Load

dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 23 - (desvan)

Page 24: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

24

dnm.entityframework<<

una forma independiente del Marco de trabajo usa-do en el mapeo relacional.

Con respecto al soporte del modelo N-capas,la próxima versión de EF ofrecerá varias vías parafacilitar el desarrollo de este tipo de aplicaciones,incluyendo un modelo basado en la auto-gestión delos cambios por parte de las entidades (self-trackingentities), de forma que éstas, al serializarse, man-tengan la información de estado, y podamos, portanto, implementar fácilmente modelos de concu-rrencia optimista en el escenario desconectado.

Por otro lado, para mejorar la experiencia de usode LINQ to Entities, y poder usar en las consultas lasfunciones canónicas de Entity SQL (matemáticas, decadenas, de fechas, etc.), se va a permitir la posibilidadde definir métodos que se mapeen a funciones defini-das o declaradas en el nivel conceptual (EDM) o en elespacio de almacenamiento (SQL Server, etc.), de for-ma que a través de estos métodos podamos hacer usode la función correspondiente dentro de una consultade LINQ to Entities. Un ejemplo de esta posibilidadse refleja en el listado 3, donde inicialmente mapea-mos la función canónica DiffYears, y luego la usamosdentro de una consulta.

Para finalizar, y no menos importante que el res-to de novedades, los amantes de TDD (Test DrivenDesign) encontrarán un gran número de ventajas queles permitirán testear fácilmente las capas de persis-tencia creadas con EF, no solamente gracias a la apa-rición del soporte de POCO, sino por el hecho deque la mayoría de API están basadas en interfaces, ypor lo tanto son fáciles de simular mediantes los dis-tintos frameworks de mocking que tenemos a nuestradisposición.

ConclusionesComo hemos podido comprobar, el futuro de EFnos depara grandes novedades y mejoras, queharán la experiencia de trabajo con él mucho másproductiva y flexible. La próxima versión nos per-mitirá adaptar mucho fácilmente el comporta-miento del marco de trabajo a nuestras necesida-des y aumentar en gran medida la productividaddel desarrollo, al mismo tiempo que simplificaráel mantenimiento de las soluciones basadas en elmarco de entidades.

Bibliografía

Zorrilla, U., Hernández, O., “El Marco de entidades de ADO.NET 3.5” (I-VII), en dotNetManía nº 44-50,

enero-julio de 2008.

http://blogs.msdn.com/efdesign (Blog de diseño de EF)

http://blogs.msdn.com/adonet (Blog del equipo de ADO.NET)

http://blogs.msdn.com/dsimmons (Blog de Danny Simmons)

http://blogs.msdn.com/jkowalski (post sobre EF Lazy Loading)

http://www.olegsych.com/2007/12/text-template-transformation-toolkit (post sobre T4)

[1]

[2][3][4]

[5]

[6]

public static class FuncionesEntidades{

[EdmFunction(“EDM”, “DiffYears”)]public static Int32? DiffYears(DateTime? arg1, DateTime? arg2){

throw EntityUtil.NotSupported(System.Data.Entity.Strings.ELinq_EdmFunctionDirectCall);

}}

var consulta = from p in context.Productoswhere FuncionesEntidades.DiffYears(DateTime.Today, p.FechaCreacion) < 5select p;

Listado 3. Mapeo de funciones del modelo conceptual y uso en LINQ to Entities

dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 24 - (desvan)

Page 25: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 25 - (desvan)

Page 26: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Un claro exponente de este enfoque lo constitu-ye la utilización de ADO.NET Data Services(proyecto inicialmente conocido con el nombreclave Astoria), que a lo largo de las sucesivasentregas de esta serie abordaremos como meca-nismo para la manipulación de datos dentro delcontexto de aplicaciones Silverlight.

En esta primera entrega realizaremos una des-cripción general de ADO.NET Data Services, ydesarrollaremos un ejemplo de creación de unmodelo y servicio de datos, sobre el que poste-riormente efectuaremos pruebas de acceso y con-sultas. Si bien el título del artículo indica que uti-lizaremos Silverlight, por cuestiones de espaciono lo haremos en esta primera parte, reservandolos ejemplos de acceso al servicio desde la inter-faz de usuario para las siguientes entregas.

ADO.NET Data Services a grandesrasgosSegún se explica en [1], podemos definir ADO.NETData Services como una tecnología basada en lacombinación de una serie de librerías y patrones,cuyo principal objetivo radica en posibilitar la cre-

ación y consumo de servicios orientados a datos quese integren de una forma fácil y natural en aplica-ciones ejecutadas dentro del entorno Web.

Los servicios creados con ADO.NET DataServices permiten la obtención, filtrado, ordena-ción y demás operaciones habituales sobre losdatos. Para lograrlo, se utilizan identificadoresURI, que mediante los verbos de HTTP: GET,PUT, POST y DELETE, permiten interactuarcon los datos, los cuales se representan como unacolección de recursos de tipo REST que se trans-miten utilizando formatos como Atom (AtomPublishing Protocol) o JSON (JavaScript ObjectNotation). Adicionalmente, para organizar y repre-sentar conceptualmente el conjunto de entidadesy relaciones (asociaciones) que componen un ser-vicio de datos podemos utilizar EDM (Entity DataModel) como herramienta de modelado.

A continuación, una vez realizada la intro-ducción teórica a esta tecnología, pasaremos a laparte práctica, en la cual describiremos las prin-cipales acciones que necesitaremos implementarpara crear un servicio de tipo ADO.NET DataServices, cuyos datos puedan ser consumidos enun futuro por una aplicación cliente desarrolladaen Silverlight.

Manipulación de datos en Silverlightmediante ADO.NET Data

Services (I)

entity framework

Luis Miguel Blanco esredactor de ddotNet-Manía y consultor enAlhambra-Eidos. Ha

escrito varios libros ydecenas de artículossobre la plataforma

.NET. Consulta su blog:http://geeks.ms/blogs/

lmblanco.

La evolución en el desarrollo de aplicaciones Web hacia modelos en losque la parte cliente (AJAX, Silverlight) está dotada de una mayor inteli-gencia y programabilidad está propiciando que la arquitectura de estas apli-caciones se base, cada vez más, en servicios, fundamentalmente en lo rela-tivo a las operaciones de acceso y manipulación de las fuentes de datosutilizadas por la aplicación.

Luis Miguel Blanco

dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 26 - (desvan)

Page 27: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

27

dnm.entityframework<<

Definiendo el modelo de enti-dadesEs posible crear un servicio de datosde ADO.NET a partir de cualquier ori-gen de datos que implemente la inter-faz IQueryable<T> y, opcionalmente, lainterfaz IUpdatable, ya sea el origen dedatos relacional o no [2]. En nuestrocaso emplearemos una fuente de datosrelacional, como es la base de datos deejemplo Northwind de SQL Server.Debido a la naturaleza relacional deesta fuente de datos, es preciso definirun modelo de entidades, que utilizare-mos desde el servicio de datos que cre-aremos posteriormente.

En primer lugar, iniciaremos VisualStudio 2008 y crearemos un nuevo pro-yecto de tipo Silverlight, al que daremosel nombre ServicioDatosConsultaSL.Todos los ejemplos expuestos en el pre-sente artículo se han desarrollado conVisual Studio 2008 y .NET Framework3.5 Service Pack 1, pudiendo ser descar-gados desde el sitio Web de la revista,http://www.dotnetmania.com. A continua-ción, nos situaremos en el Explorador deSoluciones, haremos clic derecho sobreel proyecto Web de esta solución y selec-cionaremos la opción “Add” | “NewItem”, que abrirá el correspondiente cua-dro de diálogo, dentro del cual haremosclic en el elemento ADO.NET EntityData Model para crear un nuevo mode-lo de entidades, que grabaremos en unarchivo con el nombre mdlNorthwind.edmx.

Seguidamente se iniciará el asis-tente para la creación del modelo deentidades, en el que, como primer paso,indicaremos que nuestro modelo segenerará a partir de una base de datos,seleccionando el icono “Generate fromdatabase”.

En el siguiente paso, que vemos enla figura 1, proporcionaremos la infor-mación de conexión a la base de datos,obteniendo como resultado la cadenade conexión que utilizará el serviciopara acceder a ella, así como el nom-bre con el que dicha conexión se alma-cenará en el archivo Web.config.

En el paso final de este asistente,seleccionaremos aquellos elementos dela base de datos que conformarán las

entidades de nuestro modelo, que ennuestro caso serán las tablas Customers,Orders, Products, Shippers y Suppliers.

Pulsando el botón “Finish”, el asis-tente generará el modelo a partir de losdatos suministrados, ofreciéndonos eldiseñador EDM con la representaciónconceptual en forma de entidades de lastablas seleccionadas. En el caso de queentre las tablas agregadas al modelo exis-tan relaciones, éstas serán representadascomo asociaciones dentro del diseñador.

Al igual que ocurre con otrosdiseñadores, el resultado del diseño querealicemos sobre el EDM se reflejaráen un archivo de código, que contieneuna clase que representa al propiomodelo o contexto de entidades, cuyonombre (en nuestro caso NorthwindEn-tities) se compone del nombre de labase de datos más el sufijo Entities.Por otro lado, se crearán tantas clasescomo entidades hayamos definido enel modelo. Este conjunto de clases seráutilizado por el servicio de datos en lasoperaciones de mapeo y transmisiónde datos entre el cliente y el servidor.

Es importante destacar que elmodelo obtenido no es algo rígido niinmutable, sino que podemos editar lasentidades, añadir nuevas entidades, etc.

Creación del servicio dedatosUna vez creado el modelo de entida-des, el siguiente paso consiste en crearel servicio de datos, para lo cual volve-remos al explorador de soluciones, yhaciendo de nuevo clic derecho en elproyecto Web, seleccionaremos la

Figura 1. Cadena de conexión del modelo de datos.

Para organizar y representarconceptualmente el

conjunto de entidades y relaciones que componen

un servicio de datos, podemos utilizar Entity

Data Model (EDM)

dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 27 - (desvan)

Page 28: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

28

dnm.entityframework<<

opción “Add” | “New Item”, eligiendo esta vez el ico-no “ADO.NET Data Service”, al que daremos elnombre wdsNorthwind.svc.

Después de aceptar este cuadro de diálogo,nuestro servicio de datos será creado y Visual Stu-dio 2008 abrirá un editor con el código fuente delmismo, donde tendremos que añadir código adi-cional para completar su configuración.

Por una parte, podemos observar que laclase correspondiente al servicio hereda deltipo genérico DataService<T>, y deberemossustituir el parámetro de tipo (en cuyo lugaraparece un comentario con el texto “/*TODO:put your data source class name here*/”)por el nombre de la clase que representa almodelo de entidades que recientemente aca-bamos de crear: NorthwindEntities.

Por otro lado, en el método Initia-lizeService utilizaremos el parámetroconfig, de tipo IDataServiceConfiguration,para establecer las reglas de acceso al ser-vicio llamando a su método SetEntitySe-tA ccessRule; al que pasaremos como pri-mer parámetro el nombre de las entida-des a las que permitiremos acceso (el aste-risco indica que se permite el acceso atodas las entidades), mientras que en elsegundo parámetro indicaremos el tipode permiso requerido, que para este ejemplo serásin restricciones. Todo ello lo vemos en el listado1.

Verificando el funcionamiento del servi-cio de datosTras finalizar la creación del servicio, el siguientepaso lógico consistirá en comprobar su funciona-miento, y el modo más inmediato de realizar estaspruebas pasa por escribir la ruta del servicio de datosen nuestro navegador Web.

Si nos encontramos en Visual Studio 2008, des-de el Explorador de Soluciones haremos clic dere-cho en el servicio, seleccionando la opción “Set AsStart Page”, con lo que al ejecutar el proyecto des-de el entorno de desarrollo, la ruta que mostrará elnavegador (debido a que estamos utilizando el ser-vidor Web de desarrollo) será similar a la siguiente:

http://localhost:55721/wdsNorthwind.svc

En el caso de que ya tengamos alojado el servi-cio en un directorio virtual mediante IIS, la rutatendrá el formato habitual, pero apuntando, comoes lógico, al servicio:

http://localhost/ServicioDatosConsultaSL/wdsNorthwind.svc/

En ambos casos, el navegador mostrará, comoresultado de la llamada al servicio, un listado con larepresentación de las entidades que lo componen enformato Atom (el formato predeterminado de salidaempleado por ADO.NET Data Services), comovemos en la figura 2.

public class wdsNorthwind : DataService<NorthwindEntities>{

// This method is called only once to initialize // service-wide policies.public static void InitializeService(

IDataServiceConfiguration config){ config.SetEntitySetA ccessRule(“*”,EntitySetRights.A ll);

}}

Listado 1. Inicialización del servicio de datos.

Figura 2. Listado de entidades del servicio en formato Atom.

En el caso de que entre las tablas agregadas al modelo existan

relaciones, éstas serán representadascomo asociaciones dentro

del diseñador

dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:16 - 28 - (desvan)

Page 29: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dnm.entityframework<<

Acceso al contenido de las entidades del servicio

Pero como es natural, además de haber conseguido lle-gar a la puerta de entrada de nuestro servicio de datos,lo lógico es que queramos acceder a su interior, para asíobtener la información contenida en sus entidades. Estoserá algo que conseguiremos mediante la combinaciónde un conjunto de parámetros, operadores y funciones,que pasados en la cadena de consulta (query string) de laruta de acceso al servicio, nos permitirán moldear losdatos resultantes de acuerdo a nuestras necesidades.

El primer ejemplo en este sentido consistirá enobtener el contenido al completo de una de las enti-dades del servicio, para lo que partiremos de cual-quiera de las rutas expuestas en el apartado anterior,añadiéndole el nombre de la entidad (Suppliers eneste caso) de la siguiente manera:

http://localhost/ServicioDatosConsultaSL/wdsNorthwind.svc/Suppliers

La respuesta obtenida en el navegador despuésde ejecutar esta llamada al servicio, parte de la cual

Figura 3. Listado de los elementos contenidos en una entidad.

dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 29 - (desvan)

Page 30: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

30

dnm.entityframework<<

vemos en la figura 3, muestra cómo cada uno de loselementos <entry> representa un registro de la tablaSuppliers, conteniendo todo el detalle relativo a eseelemento en particular: identificador único de acce-so, propiedades, etc.

Antes de proseguir, debemos hacer un inciso acer-ca de la visualización en el navegador del contenido delas entidades, ya que en el caso de utilizar InternetExplorer, es probable que la salida no se muestre en laforma que hemos indicado. Para poder visualizarcorrectamente el resultado, debemos seleccionar en elnavegador la opción de menú “Herramientas” |“Opciones de Internet”; hacer clic en la pestaña “Con-tenido”, y dentro del apartado “Fuentes”, pulsar elbotón “Configuración”, desmarcando a continuaciónla casilla “Activar la vista de lectura de fuentes”.

Supongamos ahora que solamente queremosrecuperar un único registro de la entidad. La formade conseguirlo consiste en adjuntar al nombre de laentidad, encerrado entre paréntesis, el valor de la cla-ve primaria correspondiente al registro; en este caso,alguno de los valores del campo SupplierID, la claveprimaria de la tabla/entidad:

http://localhost/ServicioDatosConsultaSL/wdsNorthwind.svc/Suppliers(7)

Si observamos la entidad Suppliers en nuestromodelo EDM, nos percataremos de que existe una aso-ciación entre dicha entidad y Products, a través de la

propiedad SupplierID de ésta última. Esto significa quea partir de un registro de Suppliers podremos obtenertambién los registros relacionados con él de la entidadProducts. El modo de expresar esto en la llamada al ser-vicio pasa por utilizar el parámetro expand, pasándolecomo valor la entidad asociada de la que queremosobtener los registros relacionados:

http://localhost/ServicioDatosConsultaSL/wds-Northwind.svc/Suppliers(4)?$expand=Products

Otra variante en la selección de los datos la cons-tituye el parámetro filter, que combinado con algu-no de los operadores lógicos eq (equal), ne (not equal),gt (greater than), etc., nos permite aplicar un filtrobasado en una condición, como vemos en el siguien-te ejemplo:

http://localhost/ServicioDatosConsultaSL/wds-Northwind.svc/Suppliers?$filter=Country eq'Germany'

Y finalizamos esta serie de ejemplos con una peti-ción a nuestro servicio de datos que combina un filtrocon los operadores lógicos ge (greater than or equal), and('y' lógico), le (less than or equal), y finalmente el pará-metro orderby, mediante el cual ordenamos el resulta-do en base a una de las propiedades de la entidad:

http://localhost/ServicioDatosConsultaSL/w d s N o r t h w i n d . s v c / S u p p l i e r s ? $ f i l t e r =SupplierID ge 10 and SupplierID le 20&$orderby=CompanyName

ConclusiónUna presentación en profundidad de todas y cada

una de las características que podemos emplear en laURL a la hora de consultar un servicio de datos exce-dería con creces el ámbito de este artículo, por lo querecomendamos al lector la consulta de [3], dondeencontrará todos estos aspectos tratados aquí con unmayor grado de amplitud. En la segunda parte deesta serie abordaremos el acceso al servicio desde Sil-verlight, en aquellos aspectos relacionados con lasconsultas y presentación de resultados en la interfazde usuario.

Bibliografía

Overview: ADO.NET Data Services. http://msdn.microsoft.com/en-us/library/cc956153.aspx.

Data Model and Data Service Implementations (ADO.NET Data Services/Silverlight). http://msdn.microsoft.com/en-us/library/cc838239(VS.95).aspx.

Using Microsoft ADO.NET Data Services. http://msdn.microsoft.com/en-us/library/cc907912.aspx.

[1]

[2]

[3]

La clase correspondiente al servicio

hereda del tipo genérico DataService<T>

dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 30 - (desvan)

Page 31: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 31 - (desvan)

Page 32: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Sin lugar a dudas, el principal problema que tene-mos a la hora de leer datos de nuestras consultasutilizando Entity Client tiene que ver con la mate-rialización (generación de objetos fuertemente tipa-dos a partir) de los resultados. Como hemos vistoen entregas anteriores, el proceso de lectura de lasconsultas con Entity Client requiere del análisis deltipo de metadatos con el que nos encontramos encada momento hasta llegar a los tipos primitivos ocomplejos con los que construir nuestras entidadesde transporte de datos. Este proceso es una de lasprincipales fuentes de merma de la productividad,puesto que suele requerir un gran esfuerzo de codi-ficación por parte de los programadores. Conscientede esta limitación, y por otros diversos motivos, elequipo de trabajo de EF pone a nuestra disposiciónlos Servicios de objetos (Object Services), gracias alos cuales se simplifica sobremanera la materializa-ción de los resultados y las consultas sobre los mode-los conceptuales de EDM. A lo largo de este artí-culo veremos cómo utilizar los métodos de cons-trucción de consultas que forman parte de los Ser-vicios de objetos.

Tal y como es costumbre en nuestros artículos,le proponemos el modelo de entidades sobre el quebasaremos nuestros ejemplos, que se muestra en lafigura 1.

Estableciendo las bases

Para empezar, partiremos de un ejemplo sencillocon el que mostrar la primera característica que nosofrecen los Servicios de objetos: la materializaciónautomática de los resultados de las consultas. Lerecomendamos que compare el código utilizadoaquí (listado 1), con el de la misma lectura utili-zando Entity Client en ediciones anteriores.

Observe cómo, automáticamente, los resultadosobtenidos de nuestra consulta en eSQL han sido mate-rializados en función de la especificidad de nuestrotipo genérico. La variable dedicada a recibir el resul-tado de la llamada al método ObjectQuery<T>.Executepodría ser eliminada de una forma sencilla si se enu-mera directamente el objeto de consulta, el cual harápor nosotros esta llamada (listado 2).

Consulta de modelos conceptualescon Entity SQL (III)

Los métodos de construcción de consultas

entity framework

En entregas anteriores de esta serie [1], hemos venido presentando los fun-damentos de Entity SQL (eSQL), el lenguaje de consulta de modelos con-ceptuales incorporado al ADO.NET Entity Framework (en adelante EF), asícomo las diferentes API que EF pone a nuestra disposición para la ejecu-ción de las consultas. Este mes, en consideración a la naturaleza de esteespecial sobre EF, hemos preferido apartarnos algo del tema central de laserie y dedicar la columna a los métodos de construcción de consultas delos Servicios de objetos de EF, un tema que se tocó muy ligeramente en laprimera entrega y que puede ser muy útil a la hora de implementar con-sultas parametrizadas y dinámicas sobre modelos conceptuales.

Unai Zorrilla, Octavio Hernández

Unai Zorrilla esDevelopment Team

Leader de Plain Concepts.MVP desde 2004,

colabora activamente conMicrosoft en eventos de

arquitectura y desarrollo, así como en

giras de productos. Autorde los libros “Modelandoprocesos de negocio conWorkflow Foundation” y

“ADO.NET EntityFramework: Aplicaciones y

servicios centrados endatos”.

Octavio Hernández esMVP de C# desde 2004,MCSD y MCT. Autor de

los libros “C# 3.0 yLINQ" y "ADO.NET

Entity Framework:Aplicaciones y servicios

centrados en datos" (conUnai Zorrilla y EEduardo

Quintás).

dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 32 - (desvan)

Page 33: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

33

dnm.entityframework<<

Los métodos de construcciónde consultas

Por supuesto, estará seguro de acuer-do con nosotros en que en la vida reallas consultas resultan mucho más com-plejas, incluyendo muchas más casuís-ticas sobre la jerarquía de tipos, orde-naciones, filtros, paginaciones y/o agru-paciones, entre otras muchas cosas. Dehecho, la actividad de escribir nuestrasconsultas entrecomilladas es un errorfrecuente entre de los desarrolladores,que muchas veces produce dolores decabeza por la dificultad en la lectura delas mismas. Al ser simples cadenas, elcompilador nunca podrá inferir cuál esel trabajo que deseamos que la capa deacceso a datos realice, y por lo tanto,nunca podrá echarnos una mano dicién-donos si hemos cometido un error aquío allí. Si pudiéramos simplificar las con-sultas, lograríamos minimizar, que noeliminar, estos problemas, al dividir untrabajo complejo en varias o muchaspartes simples. Estas divisiones de nues-tras consultas en los objetos Object-Query<T> son posibles gracias a los deno-minados métodos de construcción deconsultas (SQL Query Builder Methods)de los Servicios de objetos de EF. En la

using (FUTBOL2006Entities dbContext = new FUTBOL2006Entities()){

ObjectQuery<Futbolista> futbolistas = new ObjectQuery<Futbolista>(

“SELECT VA LUE f FROM FUTBOL2006Entities.Futbolista as f”, dbContext);

ObjectResult<Futbolista> result = futbolistas.Execute(MergeOption.NoTracking);foreach (Futbolista item in result){

Console.WriteLine(“Nombre :{0}”, item.Nombre);}

}

Listado 1. Ejecución de consulta mediante los Servicios de objetos

using (FUTBOL2006Entities dbContext = new FUTBOL2006Entities()){

ObjectQuery<Futbolista> futbolistas = new ObjectQuery<Futbolista>(

“SELECT VA LUE f FROM FUTBOL2006Entities.Futbolista as f”, dbContext);

foreach (Futbolista item in futbolistas){

Console.WriteLine(“Nombre :{0}”, item.Nombre);}

}

Listado 2. Ejecución de consulta mediante los Servicios de objetos (2)

Figura 1. Modelo de entidades de ejemplo.

Para los casos en los queesté presente la herencia, sepodría utilizar cualquiera delos operadores que EF nosprovee para ello (de los quehablaremos en nuestra pró-xima entrega), como son losoperadores OFTYPE, TREA T eIS OF.[ ]

NOTA

ObjectQuery<Futbolista> futbolistas = new ObjectQuery<Futbolista>(

“OFTYPE(FUTBOL2006Entities.Futbolista,DNM.Futbolista)”, dbContext);

dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 33 - (desvan)

Page 34: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

34

dnm.entityframework<<

tabla 1 se presenta una lista de los méto-dos de construcción presentes enObjectQuery<T> y cuáles son sus cláusu-las homólogas en eSQL.

A lo largo de las siguientes líneas,trataremos de mostrar algunos ejem-plos de uso de varios de los métodos deconstrucción de consultas sobre nues-tro modelo conceptual de ejemplo. Unprimer ejemplo podría ser la recupera-ción de todos los futbolistas pertene-cientes al Real Madrid (perdone lalicencia), ordenados alfabéticamente ypaginados de cinco en cinco elementos.El listado 3 muestra una manera bási-ca de implementar la consulta con losServicios de objetos.

A pesar de ser la anterior una sen-tencia sencilla, puede darse cuenta decómo hay muchas posibilidades deintroducir una errata en el código eSQLincluido. Gracias a los métodos de cons-trucción de consultas, las diferentescláusulas de la consulta pueden intro-ducirse independientemente, con lo quela susceptibilidad de errores se reduceen buena medida (aunque no se elimi-na completamente: observe que losparámetros de los métodos de cons-trucción siguen siendo cadenas decaracteres), y además mejora la com-prensión de la consulta como un todo.El listado 4 implementa la misma con-sulta utilizando varios métodos de cons-trucción.

Note cómo los distintos métodosde construcción de consultas devuel-ven a su vez objetos ObjectQuery<T>,con el fin de facilitar el encadena-miento (chaining) de llamadas tan típi-co de LINQ.

Utilización de parámetros

Al igual que en las sentencias eSQL(que es en el fondo lo que se construyeal final de una cadena de ejecución deconsulta para ser enviada a EntityClient), pueden utilizarse parámetros enlos argumentos de los métodos de cons-trucción de consultas. Por ejemplo, laconsulta del listado 4 pudo haberse escri-to también como se muestra en el lista-do 5, utilizando un parámetro para elnombre del equipo.

using (FUTBOL2006Entities dbContext = new FUTBOL2006Entities()){

ObjectQuery<Futbolista> futbolistas = new ObjectQuery<Futbolista>(“Futbolista”, dbContext);

futbolistas = futbolistas.Where(“it.Club.Nombre=’REA L MA DRID’”)).Skip(“it.Nombre DESC”, “0”).Top(“5”);

foreach (Futbolista item in futbolistas){

Console.WriteLine(“Nombre :{0}”,item.Nombre);}

}

Método de construcción Expresión en eSQL

Distinct DISTINCT

Except EXCEPT

GroupBy GROUP BYIntersect INTERSECTOfType OFTYPEOrderBy ORDER BYSelect SELECT Skip SKIPTop TOP y UNIONUnion UNIONUnionA ll UNION A LLWHERE WHERE

Tabla 1. Métodos de construcción de consultas y sus equivalencias en eSQL.

using (FUTBOL2006Entities dbContext = new FUTBOL2006Entities()){

ObjectQuery<Futbolista> futbolistas = new ObjectQuery<Futbolista>(

@”SELECT VA LUE f FROM FUTBOL2006Entities.Futbolista as f WHERE f.Club.Nombre=’REA L MA DRID’ ORDER BY f.Nombre SKIP 0 LIMIT 5”,

dbContext);

foreach (Futbolista item in futbolistas){

Console.WriteLine(“Nombre :{0}”,item.Nombre);}

}

Listado 3. Ejecución de consulta mediante los Servicios de objetos (3)

Listado 4. Consulta que utiliza métodos de construcción

dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 34 - (desvan)

Page 35: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

35

dnm.entityframework<<

El identificador "it"

Es probable que le resulte curioso el uso de lasexpresiones con "it" dentro de nuestras consultas eneSQL. "it" ("eso") hace referencia de manera prede-terminada al nombre dado a la entidad que se consul-ta. Por supuesto, este “alias por defecto” es modifica-ble para cada uno de los objetos ObjectQuery<T> con los

que trabajemos; para ello, es suficiente con establecerla propiedad Name del citado tipo, tal y como se mues-tra en el listado 6.

ConclusiónEn este artículo hemos presentado los fundamentos delos métodos de construcción de consultas de EF. Sinlugar a dudas, estos métodos nos permiten reducir enbuena medida la propensión a errores en la escriturade consultas y nos ofrecen la posibilidad de crear unsistema de consultas parametrizadas y/o dinámicas, conuna materialización automática de los resultados. Des-de aquí, estimado lector, le sugerimos que investiguey practique el uso de los métodos de construcción deconsultas, que sin dudas le darán más de una alegríadurante sus desarrollos.

using (FUTBOL2006Entities dbContext = new FUTBOL2006Entities()){

ObjectQuery<Futbolista> futbolistas = new ObjectQuery<Futbolista>(“Futbolista”, dbContext);

// Modificamos el alias por defecto “it” por “jugador”futbolistas.Name = “jugador”;

futbolistas = futbolistas.Where(“jugador.Club.Nombre=@nombre”,

new ObjectParameter(“nombre”, “REA L MA DRID”));

foreach (Futbolista item in futbolistas){

// TODO: procesar futbolista

}

}

Listado 6. Asignando nombres a las entidades

Bibliografía

Zorrilla, U., Hernández, O., “Consulta de modelos conceptuales con Entity SQL” (I y II), en dotNetManía nº56-57, enero-febrero de 2009.

Zorrilla, U., Hernández, O., Quintás E., “ADO.NET Entity Framework. Aplicaciones y servicios centrados endatos”, Krasis Press, 2008. En particular, el Apéndice B ofrece una referencia de Entity SQL.

Zorrilla, U., Hernández, O., “El Marco de Entidades de ADO.NET 3.5” (I-VII), en dotNetManía nº 44-50,enero-julio de 2008.

Documentación de Entity SQL en MSDN, en http://msdn.microsoft.com/en-us/library/bb399560.aspx.

[1]

[2]

[3]

[4]

futbolistas = futbolistas.Where(“it.Club.Nombre=@nombre”, new

ObjectParameter(“nombre”, “REA L MA DRID”)).Skip(“it.Nombre DESC”, “0”).Top(“5”);

Listado 5. La consulta del listado 4, utilizando un parámetro

dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 35 - (desvan)

Page 36: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Se ha hecho común en la arquitectura de softwa-re el diseño basado en proveedores. La infraes-tructura de ASP.NET ofrece servicios de gestiónde los usuarios de un sitio Web, y para ello lacomunicación con la fuente de almacenamientodescansa en lo que se conoce como proveedor demembresía o pertenencia (Membership Provi-der), un heredero de la clase System.Web.Secu-rity.MembershipProvider. ASP.NET 2.0 incluye demanera predeterminada dos implementaciones deproveedores de membresía:

• SqlMembershipProvider, que mantiene losdatos de membresía en una base de datosMicrosoft SQL Server o Microsoft SQLServer Express.

• A ctiveDirectoryMembershipProvider, que recu-pera los datos de membresía de MicrosoftActive Directory.

En este artículo se analiza SqlMembershipPro-vider y se propone una implementación funcio-nalmente similar a la de este proveedor, perobasada en ADO.NET Entity Framework (en ade-lante EF).

SqlMembershipProvider almacena los datos demembresía usando un esquema pre-establecidode base de datos SQL. El acceso a los datos nose realiza directamente sobre las tablas que la

componen, sino que se delega en procedimien-tos almacenados [1]. Esta concepción permiteque el funcionamiento para esquemas lógicosdiferentes pueda resolverse modificando sola-mente procedimientos almacenados. Sin embar-go, el esfuerzo necesario para adaptarse a unesquema lógico distinto puede ser tedioso, ya queson más de 16 los procedimientos almacenadosque dan soporte al acceso a datos relacionado conla gestión de la membresía. Por otro lado, el desa-rrollador de la aplicación Web que usa la API demembresía no tiene necesariamente que estarfamiliarizado con T-SQL.

Por lo tanto, sería deseable que el proveedorde membresía no dependiera del esquema lógi-co de base de datos ni del sistema de gestión debase de datos.

Hacia un mejor enfoqueEF se ajusta a las exigencias impuestas por un esce-nario como éste. Su modelo de datos de entidades(Entity Data Model, EDM) nos ofrece un alto nivelde abstracción del almacén de datos. La esencia deeste nuevo marco de trabajo es proveer un contextodonde la atención se centre en entes conceptualesllamados entidades y las distintas relaciones entre

Implementación de un MembershipProvider basada en

ADO.NET Entity Framework

entity framework

En este artículo se analiza SqlMembershipProvider, el proveedor de mem-bresía (pertenencia) de ASP.NET para SQL Server, y se propone una imple-mentación funcionalmente similar a la de este proveedor, pero basada enADO.NET Entity Framework.

Guillermo de la TorreMiguel Katrib

Guillermo de la Torrees estudiante de la

Maestría en Ciencia dela Computación de la

Universidad de LaHabana y colaborador

del grupo WEBOO.Trabaja como

desarrollador desoftware en el Centro

Nacional deNeurociencias.

Miguel Katrib es doctor yprofesor jefe de progra-

mación del departamen-to de Ciencia de la Com-

putación de la Universi-dad de La Habana.

Miguel es líder del grupoWEBOO, dedicado a la

orientación a objetos y laprogramación en la Web.

Es entusiasta de .NET yredactor de

dotNetManía.

dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 36 - (desvan)

Page 37: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

ellos; el esquema lógico de los datos que-da en segundo plano, salvo a la hora deespecificar cómo asociar cada entidadhacia y desde la fuente de datos.

Lo que hay que hacer ahora es tras-ladar el conocimiento del proveedor demembresía del esquema de los datos delnivel lógico al nivel conceptual. Laestructura pre-establecida esta vez seimpone como un EDM, en adelantereferido como ASP.NET ProviderData Model o simplemente ProviderData Model, y cada almacén de datosdeberá especificar su debida corres-pondencia con esta especie de base dedatos conceptual. Gracias a ello, sepodrá considerar como medio de alma-cenamiento posible para el servicio demembresía toda fuente de datos para laque sea posible:

• Asociarla a las entidades corres-pondientes

• Disponer del soporte de EFrequerido para la gestión de losdatos.

El soporte de EF necesario paracada uno de los sistemas de gestión debase de datos del mercado es imple-mentado generalmente por las mismascompañías que los sustentan, o por ter-ceros interesados comercialmente.

ASP.NET Provider DataModelEl esquema de base de datos sobre elque opera SqlMembershipProvider fueconcebido no solo con la idea del ser-vicio de membresía en mente, sino tam-bién pensando en otros servicios dis-ponibles hoy, como el de la gestión deestado de sesión, y con la posibilidad deque se desee adicionar nuevos serviciosen el futuro. Este esquema contienetablas que son específicas de algún pro-veedor y otras que son de propósitogeneral [2].

Por simplicidad, el esquema lógico debase de datos sobre el cual trabajare-mos en este artículo es el que fue pro-puesto por Microsoft para ofrecersoporte de almacenamiento en una basede datos Microsoft SQL Server o Micro-

soft SQL Server Expressa varios exponentes delmodelo de proveedoresde ASP.NET, entre ellosel de membresía. Esteesquema lógico se puedeobtener con la herra-mienta aspnet_regsql;para ello, ejecute esta uti-lidad desde Visual Studio2008 Command Prompty siga los pasos del asis-tente que aparecerá.Nuestro modelo dedatos, al menos para estaetapa, obedecerá lo másfielmente posible alesquema lógico originalcon respecto a tablas físicas(no vistas) y procedimientos almacena-dos (figura 1).

Una alternativa pudiera basarse enque aspnet_Membership herede de asp-net_Users, pero habría entonces queenfocarse en decisiones como la de quéhacer con la relación de aspnet_Mem-bership con aspnet_A pplications, muypertinente en el esquema lógico por dis-minuir la necesidad de realizar encuen-tros (joins) y optimizar las consultas de

miembros. No obstante, nuestra inten-ción no es definir un modelo de datosideal, sino mostrar los beneficios detrasladar el conocimiento acerca delalmacén de datos de membresía de unnivel lógico a un nivel conceptual. Lafigura 2 muestra el modelo, generadoautomáticamente a partir de la base dedatos original, sobre el cual operaránuestro EdmMembershipProvider, un pro-veedor de membresía basado en EF.

dotN

etM

anía

<<

37

dnm.entityframework<<

Figura 1. Creando el ASP.NET Provider Data Model

Figura 2. ASP.NET Provider Data Model

dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 37 - (desvan)

Page 38: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

EdmMembershipProvider

El dominio de fuentes de datos sobrelas cuales pudiera operar EdmMembers-hipProvider es amplio y puede sermedido por la capacidad de mapeo deEDM. No obstante, una solución queobvie completamente los procedi-mientos o funciones del almacén noes lo mejor, puesto que éstos en oca-siones pudieran ser la decisión másacertada. Imagine escenarios dondeevitar viajes de ida y vuelta de datos(roundtrips), desatar acciones com-plejas en el servidor ante condicio-nes aleatorias o una alta explotaciónde la potencia del lenguaje de con-sulta nativo sean requerimientosprioritarios. La gran diferencia conel enfoque de SqlMembershipProvideres el hecho de que no será la estrate-gia primaria, sino una alternativa paracuando las necesidades rebasen elalcance del EDM.

Tendremos entonces dos contextostotalmente distintos de comporta-miento operacional:

• Acceso a datos, caracterizado pordelegar la ejecución en llamadasa procedimientos almacenados.

• Esquema de datos, que se basa enconsultar el modelo.

Un modo de comportamiento deuna operación se especifica según unode los dos correspondientes valores deltipo enumerado ProgrammabilityMode:DataA ccess para acceso a datos y DataS-chema para esquema de datos.

Una clase que herede de System.Web.Security.MembershipProvider debeimplementar los métodos de ésta paragarantizar una adecuada interaccióncon el servicio de membresía. Cadauna de estas operaciones, según Edm-MembershipProvider, sería ejecutada ensolo uno de los modos posibles decomportamiento funcional. La tabla1 muestra las operaciones básicas detodo proveedor de membresía y loscorrespondientes atributos (de valo-res DataA ccess o DataSchema) especifi-cables por operación para manipularsu modo de comportamiento.

La implementación interna de cadauno de estos métodos obedecería unpatrón de la forma “si mi correspondientemodo de programabilidad es igual a Data-A ccess, invoco el procedimiento almace-nado asociado; si no, consulto el modelode datos”. Es importante destacar el nivelde granularidad que ofrece este controlpor operaciones, permitiendo un modomixto de comportamiento, que posibili-ta que algunas operaciones se ejecutenmediante llamadas a procedimientosalmacenados y otras consultando elmodelo. Para evitar tener que hacer unaconfiguración exhaustiva, establezca pri-mero el valor por defecto con el atributodefaultMode y luego declare todos aque-llos modos que difieran del valor pordefecto.

Visto desde la perspectiva de progra-mación, EDM es un almacén de datos másy por tanto debe integrarse a las tecno-logías de acceso a datos de .NET. EF ofre-ce una API para consultar modelos con-ceptuales siguiendo el patrón de diseñode clientes ADO.NET, que se denominaEntityClient. Leer datos mediante estecliente suele ser mucho más complicado,dado que las columnas no tienen por quéser siempre valores simples sino quepudieran ser a su vez colecciones de datos;por ejemplo, para contener los resultadosde la consulta de una propiedad de nave-gación. Su consulta se basa en un lengua-je estilo SQL, pero diseñado específica-mente para manipular entidades: eSQL.Este escenario de uso es idóneo cuandousted necesita obtener resultados auto-descriptivos, pero es trabajoso para situa-ciones simples. Para facilitar las cosas, EFofrece una capa superior sobre Entity-Client, conocida como Object Services,en la que las consultas también se expre-san mediante eSQL, pero los resultadosse pueden obtener como objetos. Final-mente, una tercera variante de interaccióncon un modelo conceptual es LINQ toEntities, un dialecto de LINQ para con-sultar modelos de entidades. Todo esteentorno es provisto por EF; para másinformación al respecto, revise [5]. Con-sultar el modelo (modo de programabili-dad DataSchema) se refiere a basarse en unade estas tres alternativas, según sea másconveniente.

Operación AtributoCreateUser createUserMode

ChangePasswordQuestionA ndA nswer changePasswordQuestionA ndA nswerMode

GetPassword getPasswordMode

ChangePassword changePasswordMode

ResetPassword resetPasswordMode

UpdateUser updateUserMode

ValidateUser validateUserMode

UnlockUser unlockUserMode

GetUser (sobrecarga por identificador) getUserByUserIdMode

GetUser (sobrecarga por nombre) getUserByNameMode

GetUserNameByEmail getUserNameByEmailMode

DeleteUser deleteUserMode

GetA llUsers getA llUsersMode

GetNumberOfUsersOnline getNumberOfUsersOnlineMode

FindUsersByName findUsersByNameMode

FindUsersByEmail findUsersByEmailMode

dotN

etM

anía

<<

38

dnm.entityframework<<

Tabla 1. Operaciones de un proveedor de membresía y sus respectivos atributos deespecificación de modo de programabilidad en EdmMembershipProvider

dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 38 - (desvan)

Page 39: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

39

dnm.entityframework<<

Configuración e inicializacióndel EdmMembershipProvider

De todos los métodos de un provee-dor, el primero que se invoca es Ini-tialize, que recopila toda la infor-mación de la configuración y prepa-ra la instancia para las llamadas sub-siguientes. Es una operación funcio-nal que obedece al patrón de diseñogeneral heredado de ProviderBase, laclase base para el modelo extensiblede proveedores en .NET. En estepunto es donde se hacen los cheque-os de validación.

Además de aquellos atributos XMLreconocidos por todo proveedor demembresía, como passwordFormat yapplicationName, EdmMembershipProviderreconoce:

• Los modos de programabilidadpor operación, que incluyen losreferidos en la tabla 1 y el espe-cial defaultMode.

• El manifiesto de los proveedorescuyo soporte tiene instalado lafuente de datos; esto es, tablas, pro-cedimientos y todo elemento delesquema de datos en cuestión (tabla2). Estos atributos se hacen nece-sarios por el desconocimiento quese tiene en el modelo de la verda-dera naturaleza lógica del almacén.

Los atributos de manifiesto se uti-lizan debido a la incapacidad por par-te del modelo conceptual de conocerel esquema lógico real del almacén dedatos. Por ejemplo, cuando se elimi-ne un usuario, debe existir una formade borrar en consecuencia el perfil delusuario si existiese también soportepara un proveedor de perfiles (Profi-leProvider). Vea en el listado 1 unaconfiguración típica de un EdmMem-bershipProvider.

Procedimientos almacenadosen el ASP.NET Provider DataModelEn un EDM es posible hacer uso deprocedimientos almacenados de dosformas: como entradas de modifica-ciones para un tipo de entidad deter-minado (inserción, actualización y eli-minación) o como funciones de impor-tación. La primera es parcialmenteválida para embeber lógica de cambiosen el ASP.NET Provider Data Model,pero solo funcionaría si el modo deprogramabilidad de las operaciones,que provoquen cambios en la entidadde interés, es DataSchema.

La función de importación es elrecurso de modelado que más hemosexplotado, tratando así a los procedi-mientos almacenados como “ciuda-danos del nivel conceptual”. Alimportarse una función, debe especi-ficarse si retornará datos o no, y encaso positivo indicar un tipo de retor-no, que puede ser una entidad o untipo escalar. La generación automáti-ca de código dotará entonces de unmétodo equivalente al descendientede ObjectContext generado. Si el tipode retorno es una entidad, todo fun-ciona sin problemas. Sin embargo,deben distinguirse tres patrones fun-damentales que hay que “retocar”

<membership defaultProvider=“EdmProvider“ userIsOnlineTimeWindow=“20“><providers>

<add name=“EdmProvider“type=“Providers.EdmMembershipProvider“connectionStringName=“EntitiesProviderConnection“enablePasswordRetrieval=“false“enablePasswordReset=“true“requiresQuestionA ndA nswer=“true“passwordFormat=“Hashed“applicationName=“SecuredA pplication“defaultMode=“DataSchema“membershipProvider=“true“/>

</providers></membership>

Listado 1. Configuración típica de EdmMembershipProvider

Atributo de manifiesto ExplicaciónmembershipProvider Indica que la fuente de datos incluye soporte para

el Membership Provider.

roleProvider Indica que la fuente de datos incluye soportepara el Role Provider.

siteMapProvider Indica que la fuente de datos incluye soportepara el Site Map Provider.

sessionStateProvider Indica que la fuente de datos incluye soportepara el Session State Provider.

profileProvider Indica que la fuente de datos incluye soportepara el Profile Provider.

webEventProvider Indica que la fuente de datos incluye soportepara el Web Event Provider.

webPartsPersonalizationProvider Indica que la fuente de datos incluye soportepara el Web Parts Personalization Provider.

Tabla 2. Documentación de los atributos de manifiesto

dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 39 - (desvan)

Page 40: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

40

dnm.entityframework<<

para lograr un modelo de objetoshomogéneo:

• Procedimiento almacenado queretorna un tipo escalar (ya seadirectamente como resultado deconsulta o estratégicamentemediante el valor de retorno delprocedimiento).

• Procedimiento almacenado queretorna un tipo anónimo.

• Procedimiento almacenado conparámetros de salida.

Cualquiera de estos casos impidela generación automática de un méto-do equivalente en la capa de objetos,por lo que es necesario resolverlosmanualmente.

En los métodos generados auto -máticamente que retornan entidadesse aprecia un proceder bastante claro:primero crear y configurar por cadaparámetro de la función un objeto aso-ciado de tipo ObjectParameter y poste-riormente invocar ObjectContext.ExecuteFunction<T> con el conjunto deobjetos ObjectParameterpreviamente con-figurados, donde T es el tipo de entidad aretornar. Observe la signatura de Execu-teFunction<T> en el listado 2: functionNa-me representa el nombre del procedi-miento o función a llamar y parameterslos parámetros previamente configura-dos. Con ObjectResult<T> se puede iterarsobre los resultados. Veamos en lo quesigue cómo lidiar similarmente con pro-cedimientos almacenados que devuelventipos escalares mediante el valor de retor-no del procedimiento o tipos anónimos.

Procedimiento almacenadoque “retorna” tipo escalarmediante el valor de retorno

Esta característica no está soportadacompletamente en la versión 1.0 deEF. Se puede importar un procedi-miento almacenado que estratégica-mente devuelva un tipo escalar en elvalor de retorno, pero su equivalen-te en el modelo de objetos no segenerará. Sin embargo, es posible

invocar el procedimiento medianteEntityClient y efectuar manualmen-te la lectura del valor de retorno. Paraello hemos desarrollado el métodoextensor del listado 3.

Con este método se puede entoncesejecutar procedimientos que no produz-

can resultado o que estratégicamenteretornen un valor escalar. Soporta adi-cionalmente parámetros de salida, obten-ción del valor de retorno con que finalizóla ejecución –aun cuando no se produz-ca directamente resultado alguno– eincluso permite optar por el chequeo de

protected ObjectResult<TElement> ExecuteFunction<TElement>(

string functionName,params ObjectParameter[] parameters

) where TElement: IEntityWithChangeTracker

Listado 2. Signatura de ObjectContext.ExecuteFunction<T>

public static void ExecuteNonQuery(this ObjectContext ctx, string functionName, out int returnCode, bool checkReturnCode,params EntityParameter[] parameters)

{

DbCommand cmd = ctx.Connection.CreateCommand();cmd.CommandText = ctx.DefaultContainerName+“.”+functionName;cmd.CommandType = System.Data.CommandType.StoredProcedure;cmd.Parameters.A ddRange(parameters);

EntityParameter returnValue = new EntityParameter(“ReturnValue”, System.Data.DbType.Int32);

returnValue.Direction =System.Data.ParameterDirection.ReturnValue;

cmd.Parameters.A dd(returnValue);

bool closed = false;if(cmd.Connection.State == System.Data.ConnectionState.Closed){

cmd.Connection.Open();closed = true;

}try{ cmd.ExecuteNonQuery(); }finally{

if (closed)cmd.Connection.Close();

}

returnCode = (int)returnValue.Value;if (checkReturnCode && (returnCode != 0))

throw new ReturnCodeException(returnCode);}

Listado 3. Método extensor ExecuteNonQuery

dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 40 - (desvan)

Page 41: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

41

dnm.entityframework<<

este último para detectar ejecuciones falli-das. El listado 4 muestra una llamada a lafunción para consultar la cantidad de usua-rios conectados, donde el valor de retor-no es la cantidad solicitada. Si se tratarapropiamente de un procedimiento queretorna un tipo escalar ExecuteNonQuery

no sería suficiente, porque habría quereemplazar la llamada a DbCommand.Execu-teNonQuery por DbCommand.ExecuteScalar.El listado 6 ejemplifica una llamada a lafunción con que se crea un usuario, peroel código de retorno esta vez informa eltipo de error ocurrido si no se pudo efec-

tuar la creación (cero en ausencia de erro-res). Ambos casos utilizan el método Exe-cuteNonQuery anterior con semánticas dis-tintas. Por último, el listado 5 muestra elmétodo estático CreateInputParam de laclase ProvidersUtility, útil en estas imple-mentaciones porque modulariza la crea-ción y configuración de un parámetro deentrada.

Procedimiento almacenadoque retorna tipo anónimoUn caso un poco más complicado sonlos procedimientos almacenados queretornan estructuras; el problema esdebido a que EDM aún no soportaresultados estructurados que no seanentidades. La solución es entoncesmodelar entidades ficticias que seancompatibles en número, tipo y nom-bre con las columnas que devuelve elprocedimiento almacenado.

internal int GetNumberOfUsersOnline(string applicationName, int minutesSinceLastInA ctive, DateTime currentTimeUtc)

{int returnCode;

this.ExecuteNonQuery(“GetNumberOfUsersOnline”, out returnCode,false,ProvidersUtility.CreateInputParam(

“A pplicationName”, System.Data.DbType.String, applicationName),

ProvidersUtility.CreateInputParam(“MinutesSinceLastInA ctive”, System.Data.DbType.Int32,minutesSinceLastInA ctive),

ProvidersUtility.CreateInputParam(“CurrentTimeUtc”, System.Data.DbType.DateTime,currentTimeUtc)

);

return returnCode;

Listado 4. Llamada a procedimiento que retorna un tipo escalar

Nuestro método extensorExecuteNonQuery invoca

el procedimiento almacenado mediante EntityClient y efectúa

manualmente la lectura del valor de

retorno

public static EntityParameter CreateInputParam(string paramName, DbType dbType, object objValue)

{EntityParameter parameter = new EntityParameter(paramName, dbType);if (objValue == null){

parameter.IsNullable = true;parameter.Value = DBNull.Value;return parameter;

}parameter.Value = objValue;return parameter;

}

Listado 5. Método estático para la creación y configuración de un parámetro

dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 41 - (desvan)

Page 42: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

42

dnm.entityframework<<

En el listado 7 se muestra un fragmento de códigodel procedimiento almacenado aspnet_membership_GetU-serByName, que retorna los datos del miembro con unnombre específico.

Veamos cómo efectivamente en fren tar este caso.Lo primero que se debe hacer es definir el EntityTy-pe y el EntitySet en el SSDL (listados 8 y 9, res-

internal void CreateUser(string applicationName, string userName,string password, string passwordSalt, string email,string passwordQuestion, string passwordA nswer,bool isA pproved, DateTime currentTimeUtc, DateTime? createDate, int uniqueEmail,int passwordFormat, ref Guid userId, out int status)

{// Parámetro de salidaEntityParameter userIdParameter =

ProvidersUtility.CreateInputParam(“UserId”,System.Data.DbType.Guid,userId

);

userIdParameter.Direction = System.Data.ParameterDirection.Output;

EntityParameter[] parameters = new EntityParameter[]{

ProvidersUtility.CreateInputParam(“A pplicationName”,System.Data.DbType.String, applicationName),

ProvidersUtility.CreateInputParam(“UserName”,System.Data.DbType.String, userName),

ProvidersUtility.CreateInputParam(“Password”,System.Data.DbType.String, password),

ProvidersUtility.CreateInputParam(“PasswordSalt”,System.Data.DbType.String, passwordSalt),

ProvidersUtility.CreateInputParam(“Email”, System.Data.DbType.String, email),

ProvidersUtility.CreateInputParam(“PasswordQuestion”,System.Data.DbType.String, passwordQuestion),

ProvidersUtility.CreateInputParam(“PasswordA nswer”,System.Data.DbType.String, passwordA nswer),

ProvidersUtility.CreateInputParam(“IsA pproved”,System.Data.DbType.Boolean, isA pproved),

ProvidersUtility.CreateInputParam(“CurrentTimeUtc”,System.Data.DbType.DateTime, currentTimeUtc),

ProvidersUtility.CreateInputParam(“CreateDate”,System.Data.DbType.DateTime, createDate),

ProvidersUtility.CreateInputParam(“UniqueEmail”,System.Data.DbType.Int32, uniqueEmail),

ProvidersUtility.CreateInputParam(“PasswordFormat”,System.Data.DbType.Int32, passwordFormat),

userIdParameter};

this.ExecuteNonQuery(“CreateUser”, out status, false,parameters);

userId = (Guid)userIdParameter.Value;

}

Listado 6. Llamada a procedimiento con parámetro de salida (UserId)

SELECT m.Email, m.PasswordQuestion, m.Comment, m.IsA pproved, m.CreateDate, m.LastLoginDate, u.LastA ctivityDate,m.LastPasswordChangedDate, u.UserId, m.IsLockedOut, m.LastLockoutDate

FROM dbo.aspnet_A pplications a, dbo.aspnet_Users u,dbo.aspnet_Membership m

WHERE @UserId = u.UserId A ND u.UserId = m.UserId

Listado 7. Ejemplo de sentencia de retorno enaspnet_membership_GetUserByName

<EntityType Name=“aspnet_trick_GetUserByName“><Key><PropertyRef Name=“UserId“/>

</Key><Property Name=“Email“ Type=“nvarchar“

MaxLength=“256“ /><Property Name=“PasswordQuestion“ Type=“nvarchar“

MaxLength=“256“ /><Property Name=“Comment“ Type=“ntext“ /><Property Name=“IsA pproved“ Type=“bit“

Nullable=“false“ /><Property Name=“CreateDate“ Type=“datetime“

Nullable=“false“ /><Property Name=“LastLoginDate“ Type=“datetime“

Nullable=“false“ /><Property Name=“LastA ctivityDate“ Type=“datetime“

Nullable=“false“ /><Property Name=“LastPasswordChangedDate“

Type=“datetime“ Nullable=“false“ /><Property Name=“UserId“ Type=“uniqueidentifier“

Nullable=“false“ /><Property Name=“IsLockedOut“ Type=“bit“

Nullable=“false“ /><Property Name=“LastLockoutDate“ Type=“datetime“

Nullable=“false“ /></EntityType>

Listado 8. EntityType ficticio (SSDL)

dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:17 - 42 - (desvan)

Page 43: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

43

dnm.entityframework<<

pectivamente). En este último se haceuso de consultas definitorias (Defi-ningQuery) como vía para incluir tex-to descriptivo.

De manera similar, hay que defi-nir la contrapartida en los conceptos.En el nivel conceptual existe la preo-cupación de que estos falsos tipos nosean expuestos a los clientes de las cla-ses generadas, porque una consultasobre ellos conllevaría a un error enejecución puesto que “False EntitySet” no es una consulta válida. Noteel uso de modificadores de visibilidad.Definamos el EntityType y el Entity-Set en el CSDL (listados 10 y 11, res-pectivamente).

Ahora ya podemos especificar elmapeo entre los tipos: el del aspnet_trick_GetUserByNamedel SSDL con el asp-net_trick_GetUserByName del CSDL (lis-tado 12). Luego se debe importar, apoya-do en el diseñador visual, la función asp-net_membership_GetUserByName, definien-do como tipo de retorno la entidad asp-net_trick_GetUserByName [4].

<EntitySet Name=“aspnet_trick_GetUsersByName“EntityType=“ProviderModel.Store.aspnet_trick_GetUserByName“><DefiningQuery>

False Entity Set</DefiningQuery>

</EntitySet>

Listado 9. EntitySet ficticio (SSDL)

<EntityType Name=“aspnet_trick_GetUserByName“a:TypeA ccess=“Internal“xmlns:a=“http://schemas.microsoft.com/ado/2006/04/codegeneration“>

<Key><PropertyRef Name=“UserId“ />

</Key><Property Name=“Email“ Type=“String“ MaxLength=“256“

Unicode=“true“ FixedLength=“false“ /><Property Name=“PasswordQuestion“ Type=“String“ MaxLength=“256“

Unicode=“true“ FixedLength=“false“ /><Property Name=“Comment“ Type=“String“ MaxLength=“Max“

Unicode=“true“ FixedLength=“false“ /><Property Name=“IsA pproved“ Type=“Boolean“ Nullable=“false“ /><Property Name=“CreateDate“ Type=“DateTime“ Nullable=“false“ /><Property Name=“LastLoginDate“ Type=“DateTime“

Nullable=“false“ /><Property Name=“LastA ctivityDate“ Type=“DateTime“

Nullable=“false“ /><Property Name=“LastPasswordChangedDate“ Type=“DateTime“

Nullable=“false“ /><Property Name=“UserId“ Type=“Guid“ Nullable=“false“ /><Property Name=“IsLockedOut“ Type=“Boolean“ Nullable=“false“ /><Property Name=“LastLockoutDate“ Type=“DateTime“

Nullable=“false“ /></EntityType>

Listado 10. EntityType ficticio (CSDL)

<EntitySet Name=“aspnet_trick_GetUsersByName“EntityType=“ProviderModel.aspnet_trick_GetUserByName“a:GetterA ccess=“Private“xmlns:a=“http://schemas.microsoft.com/ado/2006/04/codegeneration“ />

Listado 11. EntitySet ficticio (CSDL)

Para hacer uso de los procedimientos almacenados

que retornan tipos anónimos, modelamos

entidades ficticias que seancompatibles en número, tipo y nombre con las

columnas que devuelve elprocedimiento

dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 43 - (desvan)

Page 44: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Conclusiones

En este artículo se han analizado losbeneficios de trasladar el modelo de pro-veedor de membresía de ASP.NET de

un nivel lógico a un nivel conceptual.Se ha presentado una implementaciónde proveedor basado en EF, EdmMem-bershipProvider, explicándose los prin-cipios de su funcionamiento, la flexi-

bilidad de su comportamiento opera-cional y el modelo conceptual sobre elque opera: el ASP.NET ProviderData Model. Posteriormente, se hadiscutido sobre cómo dotar a la capade objetos del modelo con métodos deinstancia que invoquen procedimien-tos almacenados importados como fun-ciones, comenzando con aquellos queretornan tipos escalares, a la vez quepermitan parámetros de salida, o queretornen tipos anónimos. En una pró-xima entrega se espera completar lasespecificidades de las funciones impor-tadas y repasar diferentes escenarios ycasos de estudio.

dotN

etM

anía

<<

44

dnm.entityframework<<

Bibliografía

Microsoft Corporation. Membership providers. http://msdn.microsoft.com/en-us/library/aa478949.aspx.

Microsoft Corporation. Microsoft ASP.NET 2.0 Providers: Introduction. http://msdn.microsoft.com/en-us/library/aa478948.aspx.

Zorrilla, Unai y Hernández, Octavio “El Marco de trabajo de entidades de ADO.NET 3.5 (III)”, dotNetManía nº 45, marzo de 2007.

Zorrilla, Unai y Hernández, Octavio “El Marco de trabajo de entidades de ADO.NET 3.5 (VI)”, dotNetManía nº 49, junio de 2007.

Zorrilla, Unai, Hernández, Octavio y Quintás, Eduardo. ADO.NET Entity Framework. Aplicaciones y servicios centrados endatos. Krasis Press, 2008.

[1]

[2]

[3]

[4]

<EntitySetMapping Name=“aspnet_trick_GetUsersByName“><EntityTypeMapping

TypeName=“IsTypeOf(ProviderModel.aspnet_trick_GetUserByName)“><MappingFragment StoreEntitySet=“aspnet_trick_GetUsersByName“>

<ScalarProperty Name=“LastLockoutDate“ColumnName=“LastLockoutDate“ />

<ScalarProperty Name=“IsLockedOut“ColumnName=“IsLockedOut“ />

<ScalarProperty Name=“UserId“ColumnName=“UserId“ />

<ScalarProperty Name=“LastPasswordChangedDate“ColumnName=“LastPasswordChangedDate“/>

<ScalarProperty Name=“LastA ctivityDate“ColumnName=“LastA ctivityDate“ />

<ScalarProperty Name=“LastLoginDate“ColumnName=“LastLoginDate“ />

<ScalarProperty Name=“CreateDate“ColumnName=“CreateDate“ />

<ScalarProperty Name=“IsA pproved“ColumnName=“IsA pproved“ />

<ScalarProperty Name=“Comment“ColumnName=“Comment“ />

<ScalarProperty Name=“PasswordQuestion“ColumnName=“PasswordQuestion“ />

<ScalarProperty Name=“Email“ColumnName=“Email“ />

</MappingFragment></EntityTypeMapping>

</EntitySetMapping>

Listado 12: Mapeo de aspnet_trick_GetUserByName (SSDL) conaspnet_trick_GetUserByName (CSDL)

[5]

Hemos analizado los beneficios de trasladar elmodelo de proveedor de

membresía de ASP.NET deun nivel lógico a un

nivel conceptual

dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 44 - (desvan)

Page 45: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 45 - (desvan)

Page 46: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Antes de nada, vamos a definir qué entendemospor arquitecturas N-Tier y N-Layer.

Una aplicación N-Tier es una aplicación basa-da en tres o más niveles físicos, como nivel de clien-te/presentación, nivel de servidor de componentes denegocio y nivel de datos (servidores de bases de datos,etc.). Actualmente también hacemos uso de ser-vicios Web (o, mejor incluso, específicamente deservicios WCF) para comunicar el nivel clien-te/presentación con el nivel de servidor de com-ponentes.

La figura 1 muestra un diagrama típico dearquitectura N-Tier. Es un diagrama que me costóbastante encontrar, porque es de una presentaciónde Microsoft de aproximadamente 1998, en la épo-ca de Windows NT 4.0 y MTS (Microsoft Tran-saction Server), y poco después Windows DNA yCOM+. Sin embargo, aunque las tecnologías inter-nas han cambiado mucho en estos años, la arqui-tectura básica de estos niveles físicos (tiers) es lamisma ☺.

Como se puede observar, en una arquitecturaN-Tier las aplicaciones cliente (bien basadas enWindows Forms, WPF o incluso Silverlight) nece-sitan acceder remotamente al nivel de servidor deaplicaciones haciendo uso, por ejemplo, de servi-

cios WCF. Relativo a esto, en mi opinión, las apli-caciones RIA (Rich Internet Applications) son untipo especial de aplicaciones N-Tier.

Otro tema diferente es que probablementehabremos diseñado nuestras aplicaciones comoaplicaciones N-Layer (N-Capas), es decir, convarias capas lógicas en las que implementamosdiferentes tipos de tareas. Por ejemplo, podemostener capas como DAL (Data Access Layer), la capaBLL (Business Logic Layer), la capa BFLL (Busi-ness Façade Logic Layer), la capa de servicios WCFy una o varias capas de presentación (interfaz de

Entity Framework en aplicacionescon arquitectura N-Tier

y N-Layer

entity framework

César de la Torre trabajaactualmente en Microsoft

como Architect Advisordentro de la División deDesarrolladores y Plata-

forma de Microsoft.Su background es funda-

mentalmente la arquitec-tura y desarrollo de apli-caciones distribuidas, con

tecnología Microsoft,durante más de 11 años.

Blog: http://blogs.msdn.com/cesardelatorre.

ADO.NET Entity Framework, que es parte de .NET Framework a partirde la versión 3.5 SP1, es una plataforma de acceso a datos que hace trans-parente para el desarrollador el sistema gestor de bases de datos al queataca (SQL Server, Oracle, etc.). El objetivo de este artículo es muy prác-tico: responder a la pregunta ¿cómo podemos utilizar Entity Frameworken aplicaciones con arquitectura N-Tier o N-Layer?

César de la Torre

Figura 1

dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 46 - (desvan)

Page 47: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

47

dnm.entityframework<<

usuario), dependiendo del patrón queusemos, como MVC (Modelo-Vista-Controlador), MVP (Modelo-Vista-Pre-sentador), MV-VM (Modelo-Vista-Vis-ta Modelo), etc.

Por supuesto, dentro de dicha arqui-tectura N-Layer, usted podrá suponerque Entity Framework (en adelante EF)encaja inicialmente en la capa DAL(Data Access Layer), donde se accede alos orígenes de datos, así como tambiénhaciendo uso de entidades desconecta-das de EF, las cuales se pasarán/comu-

nicarán de unas capas de la arquitectu-ra a otras. La figura 2 muestra un dia-grama típico de arquitectura N-Layer.Y en la figura 3 vemos situadas en lascapas las diferentes tecnologías deMicrosoft, donde resalto la utilizaciónde EF en la capa de acceso a datos en laparte inferior de la arquitectura.

Por cierto, quiero resaltar que no todaslas aplicaciones N- Layer tienen que ser apli-caciones N-Tier (niveles físicos, con nivel depresentación/cliente remoto), aunque todaslas aplicaciones N-Tier sí deberían haber sido

diseñadas en modo N-Layer (capas lógicasdiferenciadas). Quiero decir con esto que, enalgunos casos, en cuantos menos niveles físi-cos tengamos dividido nuestro modelo, mejorrendimiento tendremos; por ejemplo, en unaaplicación ASP.NET tendremos la mayoríade las veces la capa de presentación y la decomponentes de negocio en el mismo servi-dor, como parte de un único nivel físico.Muchos niveles físicos pueden ser buenospara conseguir una óptima escalabilidad, sinembargo no favorecen el rendimiento purodebido a razones de latencia en las llamadasremotas. En cualquier caso, recuerde que N-Layer tiene que ver con capas lógicas.

Si volvemos a una arquitectura N-Tier (niveles físicos), como dije antes,necesitamos de mecanismos de accesoremoto (como WCF) para poder comu-nicar el nivel de cliente (por ejemplouna aplicación WPF o Silverlight) conel nivel de servidor de aplicación. Pos-teriormente, cuando se realizan con-sultas desde el servidor de componen-tes de negocio a la base de datos paraobtener datos, como por ejemplo unpedido, lo obtendremos como una enti-dad de EF. Entonces lo desconectamos(detach) de su contexto de EF, se seria-liza automáticamente por WCF y semanda como entidad desconectada porla red (gracias a los servicios WCF) has-ta llegar al nivel de presentación (apli-cación y máquina cliente).

Así pues, la mayoría de las aplica-ciones empresariales usan patrones dearquitectura que necesita de una facha-da sin estados para su lógica de nego-cio (como aplicaciones N-Tier y N-Layer). Tendremos pues escenarios conorientación a servicios, con serviciosWeb básicos o servicios WCF, aplica-ciones ASP.NET, aplicaciones tradi-cionales de escritorio Windows (clien-te rico basado en Windows Forms oWPF) o incluso aplicaciones RIA conSilverlight que consumen serviciosWCF, etc. En la mayoría de estos casosse trabaja con una filosofía de acceso adatos basada en “entidades de datos des-conectadas”. Esto es bueno porque seconsiguen aplicaciones altamente esca-lables, pues los datos de la base de datos(en las tablas reales) no sufren bloque-os mientras los usuarios están traba-

Figura 2

Figura 3

dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 47 - (desvan)

Page 48: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

48

dnm.entityframework<<

jando en el nivel cliente (por ejemplo, un formularioWPF o Silverlight). Por ejemplo, en dicha aplicacióncliente el usuario podría estar trabajando, cambian-do datos de forma “desconectada”, y podría inclusoirse diez minutos a tomarse un café mientras el for-mulario está abierto con los datos, volver, y finalmenteactualizar los datos en el sistema central (servidor deaplicaciones). En ese momento, lo que pasará es queal final de una cadena de llamadas (pasando por ser-vicios Web, componentes de negocio, etc.), una cla-se de la capa DAL, haciendo uso de “LINQ to EntityFramework”, actualizará dichos datos en la base dedatos. ¿Correcto? Bueno, si hacemos simplementeesto, sería una actualización de tipo “El último gana”,o lo que yo llamo “Actualización muy optimista” ☺.

Me explico. En muchas aplicaciones en las que notengamos requisitos muy exigentes/complejos a nivelde actualizaciones, el sistema que hemos comentadopuede ser suficiente. Pero en cambio, podemos tenerotras aplicaciones donde el usuario necesita saber silos datos que está usando en la aplicación cliente hancambiado en la base de datos mientras él estaba tra-bajando (o tomando un café) con el formulario abier-to y antes de actualizar los datos. En ese caso, debe-remos hacer uso de “actualizaciones con concurren-cia optimista”, manejando las posibles “excepcionesde concurrencia optimista”.

En este artículo nos referiremos al primer caso;vamos a ver cómo realizar actualizaciones de datosdel tipo “El último gana” en aplicaciones N-Tier (conaplicación cliente remota y datos desconectados). Paracubrir el otro escenario, más avanzado, es posible queescriba un próximo artículo; en cualquier caso, al finalde éste tenéis una referencia a mi blog [1], donde eseescenario lo tengo también contemplado.

Bien, pues a nivel de tecnología, estamos hablan-do de:

• Uso de Entity Framework y LINQ to Enti-ties en nuestra capa DAL.

• WCF como tecnología de comunicacionesremotas y orientación a servicios.

• Cualquier tecnología .NET remota (WPF,Windows Forms, OBA o incluso Silverlight)para el nivel de presentación (interfaz de usua-rio con ejecución en máquina cliente).

Opción base: actualización de datos enaplicaciones N-Tier haciendo uso de EF yentidades desconectadas

Para entender completamente lo que quiero decir,inicialmente vamos a explicar la forma más sencilla,es decir, cómo implementar actualizaciones simples

de datos en aplicaciones N-Tier haciendo uso deEntity Framework. Así pues, éste es el caso llamado“El último gana” o “Actualización muy optimista”.En este caso, no es necesario gestionar las posiblessituaciones de concurrencia optimista.

Primeramente, tendremos una clase de acceso adatos, CustomerDal, donde haremos uso de EF y LINQto Entities para realizar la consulta inicial a la base dedatos; por ejemplo, digamos que vamos a obtener losdatos de un cliente y devolver dichos datos al nivelcliente/presentación mediante un servicio WCF.Generalmente, se tiene una o más clases de negocio(BLL) entre el servicio WCF y la clase DAL (invo-caciones intermedias); en aras de simplificar el artí-culo, aquí la obviamos.

El código de dicha clase DAL sería similar al quemuestra el listado 1.

Probablemente, una muy buena opción sería usartipos genéricos en las clases de acceso a datos, paraasí no tener que repetir código parecido para dis-tintas entidades; eso también lo obvio, por simpli-ficar y hacer hincapié solo en la parte relativa a laactualización de datos desconectados en aplicacio-nes N-Tier.

Si conoce algo de LINQ to Entities, estará deacuerdo conmigo en que el código de arriba es muysencillo. Lo importante a destacar de este código esque estamos devolviendo un objeto de entidaddesconectada, pasándolo a las capas lógicas supe-riores (DAB ->BLL -> Capa servicios WCF -> Pre-sentación). Eso significa que de cara a EF estaremostratando los objetos ObjectContext como “contextosde vida corta”. Básicamente, cuando se devuelva dicha

public class CustomerDal{

private MyDataBaseEntities context;

public CustomerDal(){

context = new MyBaseEntities();}

public Customer GetCustomer(string customerID){

var q = from c in context.Customerswhere c.CustomerID == customerIDselect c;

var customer = q.First();context.Detach(customer);return customer;

}}

Listado 1

dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 48 - (desvan)

Page 49: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 49 - (desvan)

Page 50: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

50

dnm.entityframework<<

entidad al servidor con los datos modi-ficados, tendremos que hacer una re-conexión (re-attach) de dicha entidadmediante un nuevo objeto de contex-to, puesto que la entidad fue modifica-da en un estado desconectado.

Este escenario es muy típico siem-pre que usemos fachadas sin estado(como hace la mayoría de las aplica-ciones N-Tier y N-Layer).

Volviendo a nuestro código, des-pués podríamos tener un servicio WCFencargado de serializar y devolver dichaentidad desconectada.

El código del contrato de la opera-ción de servicio WCF para recuperarun cliente se muestra en el listado 2.Hay que destacar que los métodos deservicios Web deben ser lo más ligerosposibles (simplemente son un interfazde entrada externa); por eso, nuestrométodo del servicio Web está simple-mente invocando a una clase de nego-cio (CustomerBll). La clase BLL es don-de situaríamos código de lógica denegocio, seguridad, transacciones, etc.;pero en este caso es tan simple que con-siste en un único método que llama ala clase DAL y devuelve lo mismo (loque normalmente se llama en inglésMan in the middle). Por esta razón obviosu presentación.

Después de eso, la aplicación clien-te consumirá dicho servicio WCF ymostrará los datos de la entidad (losdatos de un cliente, en este caso), porejemplo en un formulario WPF. Recor-dad ahora que la aplicación cliente está

trabajando con un objeto de entidadque está desconectado, por lo que notenemos ningún ObjectStateManager deEF registrando los cambios. Veremosdespués cómo afecta esto.

Así pues, una vez que los datosestán visibles en el formulario, el usua-rio puede modificar los datos hasta quedecida actualizarlos, pulsando, porejemplo un botón “Grabar”. En estemomento, la aplicación cliente llamaráa otro método de WCF con un códi-go similar al del listado 3. El métodoWCF llama a la clase de negocio y éstaa su vez a la clase de acceso a datos, quees donde tendremos el código intere-sante de LINQ to Entities y dondevamos a ver cómo utilizar EF paraactualizar la entidad modificada quenos viene “desconectada” desde la apli-cación cliente.

El listado 4 muestra el método deactualización de la capa DAL (recuer-de que en este caso no tenemos quetratar las situaciones de concurrenciaoptimista).

Para poder aplicar cualquier actua-lización en la base de datos usando con-text.SaveChanges(), primero necesita-mos tener la entidad ligada a ese con-texto. Si simplemente utilizáramos una

// Contrato WCF[OperationContract] Customer CustomerBll_GetCustomer(string customerID);

// Implementación del método public Customer CustomerBll_GetCustomer(string customerID){

return new CustomerBll().GetCustomer(customerID);}

Listado 2

// Método WCF[OperationContract] Customer CustomerBll_UpdateCustomer(Customer customer);

// Implementación del método: public void CustomerBll_UpdateCustomer(Customer customer){

new CustomerBll().UpdateCustomer(customer);}

// Método de la clase DA L (acceso // a datos)public void UpdateCustomer(Customer customer)

{// (CDLTLL) Debemos primero // “conectar” la entidad al contexto// Hago uso de un método EXTENSOR // propio para entornos desconectados // (N-Tier, etc.)// A ttach(customer) no funcionaríacontext.A ttachUpdated(customer); context.SaveChanges();

}

Listado 3

Listado 4

En la siguiente versión de EF, seráposible utilizar “clases de enti-dad” propias para ser transpor-tadas por WCF. Esto es mejorde cara a sistemas SOA com-pletamente interoperables, don-de es preferible que las clases deentidad que se serialicen seancompletamente “agnósticas” conrespecto al sistema de acceso alos datos (EF).

[ ]NOTA

dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 50 - (desvan)

Page 51: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

51

dnm.entityframework<<

llamada al método predefinido con-text.A ttach(customer), la cosa no fun-cionaría, porque la entidad customer esdesconocida en el nuevo contexto quetenemos: este nuevo objeto de contex-to no sabe nada de esta entidad, es decir,no tiene registrado ningún cambio quese haya producido sobre ella.

Por esta razón es por la que hecreado un método extensor propiopara ObjectContext llamado A ttachUp-dated. Este método permite enla-zar/conectar objetos de entidad quevienen, desconectados, de la aplica-ción cliente remota. Su código se pre-senta en el listado 5.

Bueno, con este código ya hacemoscosas más especiales. En primer lugar,en nuestro código tenemos que deter-minar qué datos nuevos hay en nuestraentidad, es decir, cuáles serían los cam-bios si lo comparamos con los datosactuales en la base de datos. Para sabereso, necesitamos hacer una consulta ala base de datos y obtener los datosactuales. Lo hacemos mediante el méto-

do context.TryGetObjectByKey, y eso eslo que establecemos como valores ori-ginales de esa entidad para el contextoactual.

Entonces, llamamos al método con-text.A pplyPropertyChanges, proporcio-nando nuestra nueva entidad (con datoscambiados). Lo que hace EF es com-parar los “datos originales” (datos actua-les en la base de datos) con nuestrosdatos en la entidad que viene del clien-te, y entonces actualiza en el contextotodas los cambios de propiedades/cam-pos de nuestra entidad. Después de eso,ya podremos llamar a context.Save-Changes en el método principal. Ahí, EF

sí detectará los cambios con respecto ala base de datos y será posible actuali-zar la base de datos real (SQL Server,por ejemplo) con los nuevos datos.

Quiero destacar que después de lla-mar a A pplyPropertyChanges tambiénestoy llamando a A pplyReferencePro-pertyChanges. Para este caso sencillo, noes realmente necesario, pero explico quées. Este método es también otro méto-

do extensor que aplica los cambios depropiedades de mi entidad, pero entodas las entidades referenciadas den-tro de nuestro modelo EF (Customerpodría estar relacionado con Order, etc.),siempre y cuando estas otras entidadesestén presentes en el grafo de datos delcontexto actual. Este método es suma-mente importante; en caso contrario,tendríamos algo que solo valdría paraentidades completamente aisladas. Elcódigo de A pplyReferencePropertyChan-ges se presenta en el listado 6.

Con esto, ya habríamos acabado. Peroaún mostraremos otra alternativa paraimplementar la estrategia “El último en

actualizar gana”. El resultado final es simi-lar, pero sin embargo nos ahorraríamoshacer una consulta a la base de datos paraconocer los datos actuales (no ejecutaría-mos el método context.TryGetObjectBy-Key). En cambio, lo que hacemos es“decirle” al contexto que “todas las pro-piedades de mi entidad han cambiado,simplemente porque yo lo digo”. Des-pués de eso, simplemente llamaremos de

// Método extensor para contectar entidades desconectadaspublic static void A ttachUpdated(this ObjectContext context,

EntityObject objectDetached){

if (objectDetached.EntityState == EntityState.Detached){object currentEntityInDb = null;if (context.TryGetObjectByKey(objectDetached.EntityKey,

out currentEntityInDb)){

context.A pplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached);

// A plicamos los cambios en propiedades a todas las// entidades referenciadas en el contextocontext.A pplyReferencePropertyChanges(

(IEntityWithRelationships)objectDetached,(IEntityWithRelationships)currentEntityInDb);

}else{

throw new ObjectNotFoundException();}

}}

// Método extensor para tener en cuenta otras entidades del grafopublic static void A pplyReferencePropertyChanges(

this ObjectContext context,IEntityWithRelationships newEntity,IEntityWithRelationships oldEntity)

{foreach (var relatedEnd in

oldEntity.RelationshipManager.GetA llRelatedEnds()){

var oldRef = relatedEnd as EntityReference;if (oldRef != null){

// Este extremo es una referencia, no una colecciónvar newRef =

newEntity.RelationshipManager.GetRelatedEnd(oldRef.RelationshipName, oldRef.TargetRoleName) as EntityReference;

oldRef.EntityKey = newRef.EntityKey;}

}}

Listado 5 Listado 6

dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 51 - (desvan)

Page 52: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

52

dnm.entityframework<<

igual forma a context.SaveChanges, y eneste caso se actualizarán todas las pro-piedades/campos de la entidad. Simple-mente “porque yo lo he dicho” ☺.

He implementado esta técnica pormedio de otro método extensor, SetA ll-Modified, en este caso asociado a la enti-dad en lugar del contexto (listado 7).Usando este método extensor, el códi-go para la actualización de un clientequedaría tan simple como se ve en ellistado 8.

Esta sería la otra opción que tene-mos para actualizaciones simples detipo “El último gana”. La ventaja,como ya hemos mencionado, estribaen que no necesita consultar a la basede datos para conocer los datos origi-nales. La desventaja: que si tenemosmuchas propiedades/campos en laentidad, actualizaremos siempre todaslas propiedades del registro, aun cuan-do el usuario hubiera cambiado soloun campo o unos pocos. Dependien-

do de cada caso concreto, podemos uti-lizar un camino u otro.

¡Fenómeno! Pues eso parece sen-cillo, “y vivimos en un mundo siem-pre feliz”. ¿Seguro? Bueno, puesdepende, porque como dije al princi-pio del artículo, esta forma de actua-lizar los datos no cubre escenarios enlos que queramos gestionar actuali-zaciones con concurrencia optimista.Retomando nuestro caso de uso,supongamos que mientras el usuariooriginal estaba tomándose su café,otro usuario utiliza la aplicación yactualiza datos del mismo cliente enla base de datos. ¿Qué pasará cuandoel primer usuario vuelva y pulse elbotón “Grabar”? Pues lo dicho, elusuario original ni se enterará de vaa sobrescribir modificaciones que hahecho un segundo usuario, y dehecho, machacará dichos datos (“Elúltimo gana”). En muchos casos, estosería incluso lo deseable; pero enotros puede ser inaceptable. Tododepende del caso concreto.

Como ya hemos mencionado, paraun análisis de este segundo tipo de situa-ción, en la que es necesario gestionarlas actualizaciones con concurrenciaoptimista y sus excepciones, podéis con-sultar mi blog [1], donde explico endetalle una implementación de dichoescenario.

En muchos casos, la estrategia “El último gana” sería incluso lo deseable; pero en otros puede

ser inaceptable

// Método extensor de la entidad para decir que se han modificado// todas las propiedadespublic static void SetA llModified<T>(this T entity,

ObjectContext context) where T : IEntityWithKey{

var stateEntry = context.ObjectStateManager.GetObjectStateEntry(entity.EntityKey);

var propertyNameList =stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.

Select(pn => pn.FieldType.Name);foreach (var propName in propertyNameList){

stateEntry.SetModifiedProperty(propName);}

}

Listado 7

Listado 8

public void UpdateCustomer(Customer customer)

{context.A ttach(customer);customer.SetA llModified(context); context.SaveChanges();

}

Bibliografía

Post en el blog de César de la Torre en el que se describe el escenario basado en concurrencia optimista: “Optimistic Concu-rrency Updates using Entity Framework in N-Tier and N-Layer Applications”, en http://blogs.msdn.com/cesardelatorre/archive/2008/09/05/optimistic-concurrency-updates-using-entity-framework-in-n-tier-and-n-layer-applications-part-2.aspx.

[1]

dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 52 - (desvan)

Page 53: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

53

Tenemos aquí dos ejemplos de preguntas enlas que se pide modificar o extender el com-portamiento de uno de los controles origina-les de Windows Forms. En algunos casos, lasolución es muy simple a partir de las propie-dades o eventos de los controles. Por ejemplo,hacer que el TextBox funcione en mayúsculaspuede conseguirse poniendo el valor Character-Casing.Upper en su propiedad CharacterCasing.

Sin embargo, no siempre las cosas son tansencillas. Se podría hacer que el TextBox solo acep-tase números manipulando alguno de sus even-tos, como por ejemplo KeyUp. Pero el códigocomienza a complicarse, sobre todo si buscamospara el control algún comportamiento más sofis-ticado que el simple rechazo de ciertos caracte-res, y pronto nos encontramos con un formula-rio salpicado de procedimientos de tratamientode eventos que tenemos que acordarnos de con-servar y modificar junto con los controles cuan-do cambiemos algo en la interfaz de usuario.

Cuando los controles estándar no satisfacencon eficacia nuestros requisitos, es el momentode comenzar a pensar en crear nuestros propioscontroles. Para ello tendremos que crear unaclase que herede, directa o indirectamente, dela clase Control.

Si heredamos directamente de Control, la cla-se base únicamente dibujará un rectángulo enblanco, y tendremos que escribir todo el códi-go necesario para dibujar el control, así comopara implementar su comportamiento.

Otra posibilidad, con la que ya están fami-liarizados muchos desarrolladores, es la de here-

dar de UserControl (que a su vez hereda indirec-tamente de Control). En este caso estamos cre-ando lo que se denomina un “control de usua-rio”, que básicamente consiste en un contene-dor para albergar otros controles ya existentesmás el código asociado a los mismos. Visual Stu-dio soporta específicamente este tipo de con-troles, permitiendo dibujarlos desde el diseña-dor como si se tratase de formularios Windows.Gracias a estas herramientas visuales, la crea-ción de controles de usuario es muy sencilla, yno nos vamos a ocupar ahora mismo de ellos.

Finalmente, una tercera alternativa bastan-te común es la de heredar de uno de los con-troles ya existentes para extender o modificar sucomportamiento. Aplicando esta técnica, vamosa heredar de la clase TextBox y suplantar (redefi-nir, sobrescribir) el método OnKeyPress de formaque rechacemos la tecla pulsada cuando nocorresponda a un carácter numérico.

El primer paso consistirá en crear nuestraclase, bien sea dentro del mismo proyecto Win-dows Forms que la va a utilizar, o bien en unalibrería de clases independiente que luego podre-mos utilizar desde múltiples proyectos. La laborse ve facilitada gracias a que Visual Studio nospermite añadir el código a nuestro proyecto sinmás que seleccionar la correspondiente planti-lla (“Custom Control”). Nos encontraremos conuna clase en la que modificaremos la herenciapara que descienda del control que hemos ele-gido, en nuestro caso TextBox (listado 1).

Dentro de esta clase, suplantaremos los méto-dos que nos interesen para modificar el comporta-

Herencia de controles en Windows Forms

Alberto Población

Alberto Poblaciónlleva 29 años desa-rrollando software.Es MCSE, MCDBA,

MCITP, MCSD,MCPD y MCT,

además de MVP deC#. Alberto trabaja

como consultorindependiente,

dedicándose princi-palmente a la for-mación, asesora-

miento y desarrollode aplicaciones.

¿Cómo podría hacer que un TextBox presente en mayúsculas todos loscaracteres tecleados? ¿Y hacer que solo acepte números?

q&adnm

.q&

a

dnm

.q&

a

dnm

.q&

a

dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 53 - (desvan)

Page 54: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

54

dnm.q&a<<

La respuesta más sencilla suele ser lade utilizar la propiedad ReadOnly enlugar de Enabled. De esta manera, eltexto aparece en color negro y es más

fácilmente visible. No obstante, estasolución no es perfecta, dado que nose puede seleccionar cualquier colordeseado, y además el comportamien-

to en cuanto a tabulación y ubicacióndel cursor no es el mismo que cuan-do se usa Enabled=False. Para reme-diarlo, hay que manipular además la

miento del control original. En este caso,como ya hemos dicho, es el método OnKey-Press el que debe rechazar ciertos carac-teres. Para ello, será suficiente con devol-ver el valor Handled=True a través del pará-metro KeyPressEventA rgs que recibe nues-tro OnKeyPress. Con esto notificamos a laclase base que ya nos hemos encargadode procesar el carácter, con lo que no serealiza sobre él ningún tratamiento adi-cional y resulta despreciado. El listado 2muestra el código correspondiente.

Observe que, además de los carac-teres numéricos, hemos aceptado tam-bién el carácter con código 8, quecorresponde a la tecla de retroceso,para que el usuario pueda borrarcaracteres mientras teclea.

También hemos suplantado la pro-piedad Textheredada del TextBox original,con el fin de rechazar las cadenas que con-tengan caracteres no numéricos cuandosean asignadas a nuestro TextBox desdecódigo a través de esta propiedad.

Una vez compilada la clase Text-BoxNumerico, bastará con hacerla visibledesde nuestro proyecto WindowsForms (añadiendo una referencia encaso de haberla compilado en unaDLL separada), y podremos arrastrarel nuevo cuadro de texto a nuestro for-mulario Windows desde la barra deherramientas (figura 1).

Si planeamos utilizar este controlcon frecuencia, podemos añadirlo aun pestaña de la barra de herramien-tas, haciendo clic sobre ésta con elbotón derecho y seleccionando des-de el menú de contexto la opción quenos permite añadir nuevos elemen-tos. Desde aquí elegiremos la DLLque contiene nuestra clase, y el con-trol quedará permanentemente incor-porado a las herramientas. Si quere-mos personalizar el icono que apare-ce en la barra, podemos opcional-mente decorar la clase con el atribu-to ToolboxBitmap para indicar el iconodeseado.

Terminadas estas operaciones,podremos utilizar nuestro control per-sonalizado en cualquier proyectocomo si fuera uno de los controlesnativos de .NET Framework.

public partial class TextBoxNumerico : TextBox{}

public partial class TextBoxNumerico : TextBox{

protected override void OnKeyPress(KeyPressEventA rgs e){

char c = e.KeyChar;if (c >= ‘0’ && c <= ‘9’ || c == (char)8){

e.Handled = false;return;

}e.Handled = true;

}

public override string Text{

get { return base.Text; }set{

Regex re = new Regex(@”^\d*$”);if (re.IsMatch(value)) base.Text = value;

}}

}

Listado 2

Figura 1

¿Cómo podría cambiar el color de frente (ForeColor) de un TextBox cuya propiedad Enabled sea false? De forma predeterminada, el texto se presenta en color gris

y resulta poco visible.

Listado 1

dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 54 - (desvan)

Page 55: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

propiedad TabStop y/o recurrir a insertar código endistintos eventos del control para reaccionar anteel posicionamiento del cursor.

Volvemos, por tanto, a encontrarnos en una situa-ción como la de la pregunta anterior, en la que loscontroles estándar no satisfacen por completo nues-tros requisitos. Una vez más, recurriremos a la solu-ción de crear una clase hija y suplantar dentro deella la funcionalidad pertinente.

Crearemos, como en el caso del cuadro de textonumérico, una clase hija de TextBox, y en ella suplantare-mos los métodos que nos interesen para modificar elcomportamiento del control original. En este ejemploconcreto, deseamos cambiar la forma en que se dibuja elTextBox, para lo cual emplearemos el método OnPaint. Ellistado 1 presenta una primera aproximación.

Dentro del método OnPaint, en primer lugar lla-mamos al correspondiente OnPaint de nuestra clasebase, que realizará el dibujo “ordinario” del Text-Box. A continuación comprobamos si la propiedadEnabled vale False, y en ese caso dibujamos nuestropropio texto sobre el cuadro de texto.

Para pintar el texto en otro color, hemos creadouna brocha (Brush b) con el mismo color que ya estáespecificado en la propiedad ForeColor del TextBox quehemos heredado. Seguidamente, hemos llamado a lainstrucción DrawString de GDI+, pasándole el texto a

dibujar (propiedad Text heredada de la clase base), elmismo Font que también heredamos, la brocha, y elrectángulo dentro del que debe dibujar, que nos lle-ga como propiedad del argumento PaintEventA rgs reci-bido por OnPaint. Al igual que el resto de instruccio-nes de dibujo de GDI+, el método DrawString debe eje-cutarse sobre un objeto de la clase Graphics que, de lamisma manera que ClipRectangle, se recibe a través delargumento de nuestro método.

Si ahora compilamos el código, añadimos el con-trol sobre un formulario, y lo ejecutamos, lamentable-mente observaremos que no hemos conseguido nada.Nuestro TextBox continúa presentando el mismo aspec-to del original, y si seguimos la ejecución del códigocon el depurador encontraremos que no entra nuncaen nuestro método OnPaint. La razón es que nos faltahabilitar en nuestro control el estilo “dibujado por elusuario”. Esto se consigue con una llamada a SetStyleen el constructor (listado 2).

Ahora sí, si volvemos a ejecutar el programa quecontiene nuestro cuadro de texto, aunque éste ten-ga Enabled=False, el texto aparecerá en el color quehayamos establecido como ForeColor.

Pese a que lo anterior funciona, el comporta-miento todavía no es idéntico al del TextBox normal.El color de fondo queda en blanco, y el texto no seamolda al rectángulo del cuadro de texto en la for-ma que esperamos.

Para remediar el primer problema, utilizaremos lainstrucción FillRectangle para rellenar el fondo con elcolor deseado (que en el TextBox original es KnownCo-lor.Control, pero podríamos fácilmente sustituir porun color diferente). El lugar idóneo para llevar a caboesta operación es el método OnPaintBackground, que que-dará como muestra el listado 3.

dotN

etM

anía

<<

55

dnm.q&a<<

public MiTextBox(): base(){

this.SetStyle(ControlStyles.UserPaint, true); }

protected override void OnPaintBackground(PaintEventA rgs e)

{base.OnPaintBackground(e);if (!this.Enabled){using (Brush b = new SolidBrush(

Color.FromKnownColor(KnownColor.Control))){

e.Graphics.FillRectangle(b, e.ClipRectangle);}

}}

protected override void OnPaint(PaintEventA rgs e){

base.OnPaint(e);if (!this.Enabled){using (Brush b = new SolidBrush(this.ForeColor)){

e.Graphics.DrawString(this.Text,this.Font, b, e.ClipRectangle);

}}

}

Listado 1 Listado 3

Figura 2

Listado 2

dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 55 - (desvan)

Page 56: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

56

dnm.q&a<<

En cuanto a la adaptación del texto al rectángu-lo, aprovecharemos que la instrucción DrawStringdispone de un último parámetro opcional que per-mite configurar el modo de dar formato a la cade-na. Como refinamiento adicional, contemplaremostambién a través de dicho parámetro el caso de queel TextBox haya sido configurado en modo multilí-nea. Tras añadir estos cambios, nuestro OnPaint que-da como se ve en el listado 4.

Con todo esto, nuestro control personalizadoqueda casi listo para ser utilizado. Queda todavíauna pega: no hemos previsto las instrucciones nece-sarias para dibujar el texto cuando el TextBox estáhabilitado (Enabled es verdadera), con lo que su con-tenido aparece vacío en este caso. Esto se puederemediar desactivando el modo de “dibujo por elusuario” cuando se recibe false en la propiedad Ena-bled (listado 5).

Nótese que aquí hemos tenido que usar new enlugar de override, debido a que la propiedad Enabledde TextBox no está marcada como virtual.

Cuando cambiamos el valor de esta propiedad, esnecesario volver a dibujar el contenido del control.La forma más simple de conseguirlo consiste en inva-lidar su zona cliente, con lo que se volverá a dispararel OnPaint que dibujará de nuevo el contenido. Paraello disponemos del método Invalidate heredado dela clase madre, que hemos invocado en el set de nues-tra propiedad Enabled, como se ve en el listado 5. Esimportante recordar esta técnica, pues necesitaremosemplearla cada vez que añadamos a nuestro controlalguna propiedad nueva de la que dependa el aspec-to visual del control.

Con este código, tenemos ya disponible un con-trol que implementa gran parte de la funcionalidadde TextBox, y que además permite cambiar el colordel texto cuando se encuentra en estado deshabili-tado. Posiblemente con esto ya sea suficiente parautilizarlo en muchos proyectos. Si necesitamos per-feccionar algún otro de sus comportamientos, siem-pre podremos hacerlo mediante técnicas similares alas anteriores.

En conclusión, heredar de un control que yaexiste para modificar su comportamiento es algomuy eficaz y sencillo de llevar a cabo cuando la fun-cionalidad requerida es próxima a la de un controlya disponible. Si queremos cambiar el aspecto visual,necesitamos saber utilizar las instrucciones de GDI+para dibujar el control en la forma deseada. Pero siel cambio que buscamos es más simple, por ejem-plo, un TextBox que solo admita números pero noletras, el código necesario puede ser tan sencillocomo un mero override de algunas propiedades ymétodos. Quienes desarrollen aplicaciones paraWindows Forms harán bien en tener presente estatécnica, pues puede facilitar mucho su trabajo enalgunas ocasiones.

protected override void OnPaint(PaintEventA rgs e){base.OnPaint(e);if (!Enabled){

StringFormatFlags ff = StringFormatFlags.NoClip;if (!this.Multiline) ff |=

StringFormatFlags.NoWrap;using (Brush b = new SolidBrush(this.ForeColor)){

e.Graphics.DrawString(this.Text,this.Font, b, e.ClipRectangle,new StringFormat(ff));

}}

}

Listado 4

public new bool Enabled{get { return base.Enabled; }set{base.Enabled = value;this.SetStyle(ControlStyles.UserPaint, !value);this.Invalidate();

}

}

Listado 5

La forma más simple de redibujar el contenido de un control consiste en invalidar su zona cliente, con lo que se volverá a disparar el evento

OnPaint. Para ello disponemos del método Invalidate

dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 56 - (desvan)

Page 57: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

Programming Entity FrameworkJulia LermanEditorial: O'Reilly MediaPáginas: 828Publicado: febrero de 2009ISBN: 978-0596520281Idioma: inglés

Excelente ha sido la acogida de los lectores a esta primera obra de Lerman, dondeaporta un conocimiento enciclopédico de lo que puede y debe hacerse con el nuevo mode-lo de trabajo con datos propuesto por Microsoft. La autora (visite su blog en http://www.the-datafarm.com/blog) es bien conocida por sus numerosos artículos en MSDN Magazine.

Más de un año consumido en su creación, todas las partes merecen la pena por el con-tenido y por el continente: claro, bien explicado, con ejemplos suficientes pero no gigan-tescos (en VB.NET y C#), abordando problemas del día a día y sin olvidarse de ningu-no de los protagonistas del ciclo de vida de las aplicaciones. Las guías para la utilizaciónreal de EF en nuestras aplicaciones son de lo mejor de esta obra, porque aborda desdelos supuestos típicos hasta situaciones de multiproceso, control de hebras de ejecución omejoras del rendimiento. Totalmente recomendable.

Professional ADO.NET 3.5 with LINQ and the Entity FrameworkRoger JenningsEditorial: WroxPáginas: 672Publicado: febrero de 2009ISBN: 978-0470182611 Idioma: inglés

Sin llegar a la calidad técnica y estilística del anterior, se trata de una obra notable,dividida en dos partes: en los primeros 7 capítulos se explica profusamente cómo utilizarLINQ en todos los contextos donde esta tecnología tiene sentido y es más aprovechable,siempre con ejemplos en ambos lenguajes, e incluso presentando algunas tecnologíasemergentes relacionadas o en fase inicial, como Parallel LINQ, LINQ to REST, LINQTo SharePoint (LINQ4SP) y LINQ to Active Directory (antes conocida como LINQto LDAP, y disponible en http://www.codeplex.com/LINQtoA D). En la segunda parte, se abor-da detalladamente la programación con Entity Framework, incluyendo EDM, EntitySQL y LINQ to Entities, utilizando ejemplos bastante cercanos al mundo real.

El autor es, por lo demás, un veterano escritor técnico de esta editorial, que siemprese ha enfocado en los mecanismos de acceso a datos como tema principal, así como enlos lenguajes o plataformas que sirven como vehículos para ese acceso.

biblioteca.net

nove

dad

es Murach’s ADO.NET 3.5, LINQ, and the Entity Framework

with VB 2008Anne Boehm. Editorial: Mike Murach & Associates. Páginas: 712. ISBN: 978-1890774523 .

Fecha de publicación: marzo de 2009. Idioma: inglés.

Essential LINQCharlie Calvert y Dinesh Kulkarni. Editorial: Addison-Wesley Professional. Páginas: 600.

ISBN: 978-0321564160 . Fecha de publicación: marzo de 2009. Idioma: inglés.

TEXTO: MARINO POSADAS

dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:18 - 57 - (desvan)

Page 58: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotN

etM

anía

<<

58

desvánMarino Posadas

Research Channel es un canal de expresiónreservado a la comunidad de investigación ydesarrollo, donde participan miembros deMicrosoft (que son muchos y muy activos). Sondocumentos principalmente visuales a los que

se accede como presentación on-line. Allí podemos averiguar loque va a venir, en qué estado se encuentra, qué se persigue conello y en qué productos es posible que lo veamos implementa-do. Explicado por sus autores. http://www.researchchannel.org/prog/displayinst.aspx?fID=880&pID=480.

El SDK de Silverlight 3.0, disponible. Pues estees el segundo documento importante del mes quequeremos recomendar, porque Silverlight sigueganando adeptos día a día. De forma un tanto silen-

ciosa, pero ahí está: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=d09b6ecf-9a45-4d99-b752-2a330a937bc4. Incluye documentación. No obstante, el lectorinteresado deberá de estar atento a lo que se “cuece” en el Mix09,donde Silverlight alcanzaba la máxima cuota de sesiones (31),con mucha diferencia sobre sus inmediatos seguidores: UI/UX(18) y ASP.NET (14).

Community Bookmarks es un “sitio de sitios”.Almacena enlaces que apuntan a soluciones dedesarrollo encontradas y publicadas por dife-rentes miembros de la comunidad de desarro-llo. En poco tiempo ya ofrece más de 200 pági-

nas o listados de enlaces. Es una iniciativa de MSDN disponi-ble en el sitio http://social.msdn.microsoft.com/en-US/#sort=week&page=0&filter=allcontent.

DZone Snippets es un sitio donde los usuarios suben pequeñosfragmentos de código fuente de todos los orígenes y sabores queresuelven problemas concretos de desarrollo. Más de 15.000usuarios han colaborado hasta el momento con el sitio, que estáaccesible en http://snippets.dzone.com/posts.

MSDN Respuestas esun complementopara Visual Studioque nos permite buscar soluciones a los problemas dia-rios de desarrollo sin salir de casa… quiero decir delpropio IDE. Muchas categorías disponibles y más queestán por venir. Totalmente imprescindible. Es gratui-to y descargable desde http://msdn.microsoft.com/es-es/msdnrespuestas.aspx.

documentos en la red

utilidades del mes

sitios del mes

Crisis y “software factories”

La crisis nos acecha, de eso no hay duda. Sin embargo, hay empresas queparecen salir incluso reforzadas de este tipo de situaciones. Y no me refie-ro a aquellas que cuentan con subvenciones y/o avales del estado para hacerfrente a sus problemas coyunturales. Estoy fijándome en aquellas que anun-cian un incremento en sus ganancias frente a las hasta ayer directas com-petidoras que anuncian catástrofes. ¿Qué factor convierte la crisis en opor-tunidad?

No es fácil la respuesta, claro, y menos en el terreno del software. Ylíbreme Alan Turing (o quien sea) de pretender tener esa solución. Perose aprecian patrones. Con o sin crisis, las empresas siguen teniendo nece-sidades. La diferencia está en la forma de cubrirlas. Con crisis o sin ella,la mayoría busca lo “bueno, bonito y barato”. Sin crisis, las palabras “bue-nas prácticas”, “construcción para extensibilidad” o “dinero invertido amedio plazo” tienen sentido. Cuando la crisis se nota, cambiamos a “rápi-do, bonito y barato”… o “rápido y barato” (¡qué le vamos a hacer!).

Ahí es donde interviene nuestro protagonista de hoy.Pero no entendiendo la “software factory” como una máqui-na de hacer “churro-software”, sino como una actitud. Laactitud de preparar las cosas para una optimización y exten-sibilidad máxima. La de aprovechar lo existente (¿reutili-zación?) para no tener que reinventarnos una y otra vez. Yla de saber integrar lo nuevo con lo viejo para aprovecharlos valores que, siendo vetustos, cumplan su función, per-

mitiendo crecer sobre lo existente. Dar soluciones a problemas, en suma,y hacerlo en el menor tiempo posible y con la mayor solidez y capacidadde adaptación al problema del cliente.

Desde la perspectiva técnica, quizá sea –comodice Jack Greenfield (en la foto), en "The Case forSoftware Factories" (http://msdn.microsoft.com/en-us/library/aa480032.aspx)– una cuestión de añadir unnivel más de abstracción, si bien eso no significaque el desarrollo de software se reduzca a un meroproceso mecánico, según él mismo afirma. Pero sí debe concienciarnos parasaber utilizar mejor los preciosos recursos del programador experimenta-do. La componentización y el ensamblado desacoplado de las "piezas" de soft-ware que propugna la arquitectura SaaS es una buena aproximación, sinduda. El propio Greenfield, en una conferencia pronunciada en Gales, poníacomo ejemplo a la empresa BMW, que raramente fabrica el mismo automó-vil, pero no por eso renuncia a ser factoría (http://www.theregister.co.uk/2007/03/27/software_factories_greenfield). Y añade, "el reto consiste en sabercaptar cuáles son las necesidades propias del cliente, y suplirlas con el usoadecuado de herramientas y sistemas que automaticen entre el 40% y el80% de esas necesidades". Volviendo a nuestro mundo, ¿qué herramientamágica nos puede solucionar esas necesidades? Pues Visual Studio, segúnél mismo afirma en "Software Factories: Assembling Applications with Pat-terns, Models, Frameworks, and Tools" (ver http://www.amazon.com/Soft-ware-Factories-Assembling-Applications-Frameworks/dp/0471202843). Conesa intención, coordina con Rick LaPlante lo que va a ser la nueva versiónde Visual Studio (2010). Lo de menos es que esté hecha en WPF. Lo ver-daderamente importante es ese alineamiento, esa actitud productora, esa"garantía de continuidad en la innovación", que significa nuestra herra-mienta favorita. Por muchos años.

firma.firma.firma.firma

gHacks.net. Más que una utilidad, un grupo de ellas, ytodas relacionadas con navegadores, la impresión y for-mato de páginas y temas similares. Disponible enhttp://www.ghacks.net.

dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 58 - (desvan)

Page 59: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 59 - (desvan)

Page 60: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 58 abril 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX ... crear aplicaciones Web o subir los ... una

dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (Cyan)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (Magenta)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (Yellow)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (BlacK)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (PANTONE 442 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (Rojo)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (PANTONE 242 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (PANTONE Orange 021 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (PANTONE 562 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (PANTONE 145 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (PANTONE 301 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (PANTONE 1245 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (PANTONE 123 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (Azul)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (PANTONE 368 C)dotnetmania 058.pdf 26/03/2009 16:56:19 - 60 - (desvan)