ADO.NET Data Services

December 10th, 2007

Ya se encuentra disponible la primera entrega de ASP.NET 3.5 Extensions Preview, la cual pueden descargar desde aquí, seguramente el centro de todas las miradas va a estar con ASP.NET MVC, por eso no voy a hablar de él en este post, ya que tanto en los QuickStarts como en el blog de Scott Guthrie hay bastantes ejemplos e información sobre el mismo.

De lo que si les voy a hablar es de ADO.NET Data Services el cual es el nuevo nombre del antes conocido proyecto Astoria, el mismo cuenta con varios cambios desde la CTP anterior, pero para mostrárselos nada mejor que comenzar con un proyecto desde cero. Antes que nada debemos tener instalado además de ASP.NET 3.5 Extensions Preview, ADO.NET Entity Framework Beta 3 y ADO.NET Entity Framework Tools Dec 07 CTP.

Vamos a comenzar creando un nuevo proyecto Web como se ve en la siguiente imagen.

Luego crearemos nuestro modelo de datos

Seleccionamos la opción Generate from Database

Elegimos la base de datos a utilizar

Seleccionamos las tablas que usaremos para el ejemplo y hacemos click en Finish.

Concluido este paso ya tenemos listo nuestro modelo de datos

Luego seleccionamos la opción Add new ítem y creamos un nuevo ADO.NET Data Service

Si recuerdan mi post anterior sobre Astoria, al llegar a este punto solo debíamos indicar a nuestro WebDataService que utilice nuestro Entity Model y ya estaba todo listo para exponer nuestra data al mundo, pero en esta versión esto ha cambiado, ahora debemos autorizar explícitamente cuales tablas y qué tipo de permiso utilizara nuestro ADO.NET Data Service.

En la siguiente imagen podrán ver como he referenciado a Microsoft.Data.Web y a mi modelo de datos, también pueden observar como inicializo el servicio, elijo las tablas a utilizar y el tipo de permiso que deseo asignarle.

Para este ejemplo voy a dejar que todas las tablas puedan ser expuestas es por ellos que he puesto un asterisco en lugar del nombre de una tabla en particular.

using System;

using System.Web;

using System.Collections.Generic;

using System.ServiceModel.Web;

using System.Linq;

using Microsoft.Data.Web;

using OranjeModel;

namespace OranjeDataService

{

public class Oranje : WebDataService<OranjeEntities>

{

public static void InitializeService(IWebDataServiceConfiguration config)

{

config.SetResourceContainerAccessRule(“*”, ResourceContainerRights.All);

}

}

}

Si presiono F5 para correr mi aplicación, podrán ver algo similar a lo expuesto en la siguiente imagen.

Podrán apreciar que el formato en que se está mostrando la información es AtomPub (Atom Publishing Protocol), este es otro de los cambios con respecto a la anterior CTP, también podemos consumir nuestro servicio utilizando JSON.

Si desean investigar más sobre como exponer data a través de ADO.NET Data Services, podrán en encontrar más información y ejemplos en los ASP.NET 3.5 Extensions Preview QuickStarts.

Bien, ahora que ya tenemos nuestro servicio funcionando, vamos a consumirlo, el escenario más común para hacerlo, seria en una aplicación Web, pero para este ejemplo utilizare una aplicación de consola.

Vamos a crear la aplicación de consola para la demo

Luego agregaremos una referencia a Microsoft.Data.WebClient en nuestro proyecto

Como vamos a necesitar representar la entidades definidas por el Data Service, deberíamos crearlas a las mismas en nuestro proyecto, para ello utilizaremos la utilidad WebDataGen que se encuentra en la carpeta donde están instaladas las ASP.NET 3.5 Extensions Preview, ejecutaremos la utilidad y le pasaremos los siguientes parámetros.

Entre los cuales se encuentran el nombre del archivo que generaremos con las entidades y la URI donde se encuentra nuestro servicio

Finalizado el proceso ya tendremos listo nuestro modelo de datos para poder ser añadido a nuestra aplicación de ejemplo utilizando la opción Add existing item.

En el archivo Program.cs de nuestra aplicación de ejemplo vamos a crear un referencia a nuestro entity model.

using OranjeModel;

Para consumir los datos de nuestro servicio utilizaremos la librería Microsoft.Data.WebClient, la misma cuenta con dos clases, WebDataContext y WebDataQuery, la primera representa el contexto en tiempo de ejecución de un web data service dado, la segunda permite hacer consulta contra un servicio utilizando la sintaxis basada en URIs de ADO.NET Data Service.

En el siguiente código podemos ver un ejemplo de WebDataContext y WebDataQuery en funcionamiento.

using System;

using System.Collections.Generic;

using Microsoft.Data.WebClient;

using System.Linq;

using System.Text;

using OranjeModel;

namespace OranjeDataClient

{

class Program

{

static void Main(string[] args)

{

WebDataContext ctx = new WebDataContext(“http://localhost:6239/Oranje.svc”);

WebDataQuery<Players> players = ctx.CreateQuery<Players>(“/Players”);

foreach (Players p in players)

{

Console.WriteLine(“Number:” + p.Number + ” Name: “ + p.Name + ” Age: “ + p.Age);

}

}

}

}

Presionando Ctrl+F5 deberíamos de obtener un resultado similar al de la siguiente imagen.

Además de utilizar WebDataContext y WebDataContext.CreateQuery para consultar un Data Service tambien es posible hacer consultas utilizando LINQ, como verán en el siguiente ejemplo la librería Microsoft.Data.WebClient se encarga de mapear las instrucciones LINQ contra la URI del Data Service y recuperar los recursos especificados como objetos .NET

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using OranjeModel;

namespace OranjeDataClient

{

class Program

{

static void Main(string[] args)

{

OranjeEntities ctx = new OranjeEntities(“http://localhost:6239/Oranje.svc”);

var q = from p in ctx.Players

orderby p.Age

select p;

foreach (var player in q)

{

Console.WriteLine(“Number:” + player.Number + ” Name: “ + player.Name + ” Age: “ + player.Age);

}

}

}

}

Presionamos Ctrl+F5 y deberíamos de ver los datos de las jugadoras ordenados por edad.

Nuevamente y para finalizar les dejo el enlace a los QuickStarts donde podrán encontrar información más detallada.

Un vistazo a Astoria

October 14th, 2007

Astoria nos permite exponer facilmente datos a través de un servicio WCF, estos recursos los podemos navegar al estilo REST y para manipularlos utilizamos los verbos HTTP, también tenemos la posibilidad de elegir el formato en el que queremos consumir los datos, que puede ser XML, JSON o RDF.

Para trabajar con Astoria necesitamos tener instalado Visual Studio 2008 Beta 2, ADO.NET Entity Framework Beta 2ADO.Net Entity Framework Tools August 07 CTP y por supuesto la ultima CTP de Astoria.

Comenzaremos creando un nuevo sitio web, como se ve debajo en la imagen.

Astoria Data Services

A nuestro sitio web le agregaremos un ADO.NET Entity Data Model.

Astoria Data Services

Seleccionamos la opción Generate from Database.

Astoria Data Services

Elegimos la base de datos de la cual obtendremos la data a exponer por el servicio.

Astoria Data Services

Seleccionamos los objetos a utilizar.

Astoria Data Services

Concluidos estos pasos ya tenemos listo nuestro modelo de datos.

Astoria Data Services

Ahora crearemos un nuevo Web Data Service.

Astoria Data Services

Al cual configuraremos para que utilice nuestro modelo de datos.

using System;

using System.Collections.Generic;

using System.Data;

using System.Data.Objects;

using System.ServiceModel.Web;

using System.Linq;

using Microsoft.Astoria;

namespace AstoriaDemo

{

public class OranjeService : WebDataService<OranjeDataModel>

{

}

}

Para finalizar seteamos como Set As Start Page al mismo, luego abrimos el archivo web.config y agregamos la siguiente línea dentro de la sección appSettings, para poder consultar los datos en formato JSON.

<appSettings>

<add key=EnableAstoriaJSONP value=true/>

</appSettings>

Presionamos F5 y deberíamos obtener las referencias a nuestras entidades de datos, en este caso Players y Clubs.

Astoria Data Services

Si quisiera ver el listado de todas las jugadoras solo debo ingresar la siguiente Uri.

http://host/OranjeService.svc/Players

Astoria Data Services

También podemos utilizar algunos filtros para procesar los datos, por ejemplo si quisiera obtener el listado de jugadoras ordenadas por posición, solo debo ingresar la siguiente consulta.

http://host/OranjeService.svc/Players?$orderby=Position

Astoria Data Services

Si queremos ver los datos de la jugadora con el PlayerId 11.

http://host/OranjeService.svc/Players[11]

Astoria Data Services

Y por ultimo para obtener datos en formato JSON lo hacemos de la siguiente manera.

http://host/OranjeService.svc/Players[11]?$format=json

[

{

__metadata: {

Type: "Players", Base: "http://localhost:49183/OranjeService.svc", Uri: "Players[11]“

}, Age: 28, Caps: 242, Clubs: {

__metadata: {

Uri: “Players[11]/Clubs”

}

}, Description: “Minke Smabers (born March 22, 1979 in Den Haag, Zuid-Holland) is a field hockey midfielder from the Netherlands, who played more than 200 international matches for the Dutch National Women\’s Team. Her current team is Laren.”, Name: “Minke Smabers”, Number: 13, Picture: “../images/13.jpg”, PlayerId: 11, Position: “MF

}

]

Esta es solo una pequeña introducción a Astoria si están interesados en seguir investigando sobre el mismo a continuación les dejo algunos enlaces a recursos interesantes.

Microsoft Codename “Astoria”
http://astoria.mslivelabs.com/

Download Microsoft Codename “Astoria” September 2007 CTP
http://www.microsoft.com/downloads/details.aspx?FamilyId=0FA1413C-CB55-4577-960E-0F3491847F58&displaylang=en

Download ADO.NET Entity Framework Beta 2
http://www.microsoft.com/downloads/details.aspx?FamilyId=F1ADC5D1-A42E-40A6-A68C-A42EE11186F7&displaylang=en

Download ADO.Net Entity Framework Tools Aug 07 CTP
http://www.microsoft.com/downloads/details.aspx?familyid=09A36081-5ED1-4648-B995-6239D0B77CB5&displaylang=en

Project Astoria Team Blog
http://blogs.msdn.com/astoriateam/

Pablo Castro’s blog
http://blogs.msdn.com/pablo/

Channel9 - Pablo Castro: Astoria Data Services
http://channel9.msdn.com/Showpost.aspx?postid=305985

Mix07 - XD006 Accessing Data Services in the Cloud
http://sessions.visitmix.com/default.asp?event=1011&session=2011&pid=XD006&disc=&id=1573&year=2007&search=XD006