Compartir a través de


Este artículo proviene de un motor de traducción automática.

Servicios de datos

Obtener acceso a los datos en locales O en la nube con servicios de datos de ADO.NET

Elisa Flasko

Descarga de código de la Galería de código de MSDN
Examinar el código en línea

Este artículo se basa en versiones preliminares de Azure de Windows y ASP.NET MVC.

En este artículo se describen:

  • Windows Azure
  • MVC DE ASP.NET
  • Windows Azure tabla
  • En-locales el vs nube aplicación desarrollo
En este artículo se utilizan las siguientes tecnologías:
Windows Azure, ASP.NET MVC

Contenido

La aplicación
Consume un servicio de datos en instalaciones con la biblioteca de cliente de servicios de datos ADO.NET
Consultar datos
Crear, actualizar y eliminar
Consume un servicio de datos de tabla Azure
El modelo de datos tabla Azure
La biblioteca de cliente de servicios de datos ADO.NET
Definir el modelo en el cliente
Crear una tabla
Consultar datos
Crear, actualizar y eliminar
Sumar hacia arriba

los servicios web ha sido un tema activo para un número de años ahora, pero, ¿qué, quizá se pregunte, son todos los usuarios se habla sobre estos servicios de datos de últimamente?Como la arquitectura de Web ha cambiado las aplicaciones y evolucionado (con la popularidad de las aplicaciones de Internet enriquecido [RIAs], por ejemplo), se ha producido un mayor conocimiento del valor de exposición de datos sin procesar, menos cualquier interfaz o formato, en cualquier servicio o aplicación que desea consumen.Servicios de datos son simples servicios centrados en datos con una interfaz RESTful, que hacer exactamente eso: exponer datos puros para el consumo por las aplicaciones.Tales servicios exponen datos mediante una interfaz uniforme para el consumo de los clientes Web a través de una intranet corporativa o de Internet.Servicios de datos pueden generarse y alojados en sus instalaciones utilizar la biblioteca de servidor de servicios de datos de ADO.NET para exponer los datos de forma segura como un servicio, o es posible que se hizo disponible por los servicios alojados distintos, como Windows Azure tabla.Windows Azure es la base de la plataforma de nube de Microsoft.Como "sistema operativo para la nube" proporciona los pilares esenciales, necesita escribir servicios escalables y altamente disponibles.Una parte importante de Azure, Windows Azure Table, permite a los usuarios conservar los datos en la nube y exponer los datos que almacena como un servicio de datos.

Independientemente de donde está alojado el servicio de datos, el marco de servicios de datos de ADO.NET ofrece que un conjunto de bibliotecas de cliente creado para una variedad de plataformas de desarrollo de Microsoft (.NET, Silverlight, AJAX de ASP.NET y así sucesivamente) que permiten fácilmente consumir estos servicios en sus aplicaciones.

fig01.gif

Figura 1 modelo de datos de entidad expuesto por el servicio datos de Microsoft-creación de un blog

La aplicación

A lo largo de este artículo, se va creando una aplicación de Microsoft-creación de blogs simple mediante ASP.NET modelo de vista de controlador (MVC) (versión candidata) y se se detallan algunos de los escenarios típicos que surgen al generar tales aplicaciones de servicios de basados.SE supuesto un conocimiento previo de MVC y, por tanto, no se tratan los detalles de este modelo.Si necesita obtener más información acerca de MVC de ASP.NET, consulte elSitio de ASP.NET MCV. Con el fin de comparación, buscará en dos versiones de la misma aplicación básica, uno consume un servicio de datos en las instalaciones y otro consume un servicio de datos de tabla Azure.El código para ambas versiones se incluye en la descarga de código que acompaña.

La aplicación de la creación de un blog de Microsoft permite a los usuarios enviar mensajes a canales específicos, crear nuevos canales y ver mensajes en los canales de interés para ellos.El modelo que se haya expuesto por el servicio de datos para esta aplicación consta de tres tipos de entidades: mensajes, canales y usuarios, con una asignación uno a uno en gran medida a la base de datos.Merece la pena destacar en este punto, con un origen de datos en las instalaciones, este modelo contiene un participante noción de relaciones entre entidades.Los mensajes se contabilizan en un canal determinado por un usuario individual (consulte la figura 1 ).

Consume un servicio de datos en instalaciones con la biblioteca de cliente de servicios de datos ADO.NET

Comencemos creando una nueva aplicación de Web de MVC de ASP.NET mediante la plantilla Visual Studio instalado con ASP.NET MVC.

Hay dos formas principales que puede ir sobre cómo definir las clases para representar el modelo en el cliente.Puede definir simplemente el modelo mediante la definición de las clases POCO (simple objetos de CLR anterior) que se utilizará en el cliente para que representan las entidades expuestas por el servicio, que hará cuando desarrolla esta aplicación contra Windows Azure tabla, o puede utilizar el Asistente para agregar referencia del servicio en Visual Studio para generar las clases necesarias.Ocurre el usar Add Service Reference para un servicio de Windows Communication Foundation (WCF), sólo tiene haga clic con el botón secundario del mouse en el proyecto y elegir Add Service Reference.En el cuadro de diálogo Add Service Reference, escriba el identificador URI para el punto de entrada del servicio como la dirección y, a continuación, haga clic en ACEPTAR.Esto se generar las clases asociadas, basadas en la definición de servicio datos y agregarlos al proyecto.

Como visto en la figura 2 , el Asistente para agregar referencia del servicio ha generado una clase para cada uno de mis entidades: canal, mensaje y usuarios, así como una clase que representa el servicio como un todo, microblogEntities.MicroblogEntities la clase hereda DataServiceContext y se utilizará como punto de partida para tener acceso a un servicio de datos.

fig02.gif

La Figura 2 representación de las clases de modelo de la creación de un blog de Microsoft

Consultar datos

Con la aplicación configurar ahora para obtener acceso al servicio de datos, puede inicie desarrollar el resto de mi aplicación.En la página de inicio, la aplicación se proporciona una lista de los canales disponibles y que el usuario pueda ver los mensajes de hoy seleccionando un canal.El usuario también podrá filtrar en que canal según autor.Para crear la página principal, deberá crear un ActionResult en el controlador principal se asignará a la vista de índices (el controlador de inicio y vista de índices se crean de forma predeterminada en la plantilla MVC).En la página de inicio, se necesita recuperar una lista de todos los canales disponibles desde el servicio de datos, también en que consulta el servicio para los mensajes de hoy, filtrado de basándose en los datos proporcionados por el usuario (consulte la figura 3 ).

fig03.gif

La figura 3 PáginaPrincipal de sitio

La biblioteca de cliente de servicio de datos ADO.NET le permite consultar fácilmente datos con el uso de consulta integrada de lenguaje (LINQ), tal como se observa enLa figura 4 .

La acción de índice del controlador de página principal es llamado por la aplicación MVC cuando la página principal tiene acceso el explorador y devuelve los datos que se utilizará para representar la vista Index.aspx.En la figura 4 , dentro de la acción de índice, crear una instancia nueva de la microblogEntities DataServiceContext, así:

microblogEntities svc = new microblogEntities(new Uri("http://localhost:50396/MicroData.svc"));

La figura 4 obtener acceso A datos como objetos de .NET con LINQ

public ActionResult Index(string channel, string author)
    {
        microblogEntities svc = new microblogEntities(new 
        Uri("http://localhost:50396/MicroData.svc"));
        ViewData["channels"] = svc.Channels;

        int y = DateTime.Now.Year;
        int mm = DateTime.Now.Month;
        int d = DateTime.Now.Day;

        var q = from m in svc.Messages.Expand("Author").Expand("Channel")
                where m.Channel.ChannelName == channel && (m.DatePosted.Year == y && 
                m.DatePosted.Month == mm && m.DatePosted.Day == d)
                select m;

        if (!string.IsNullOrEmpty(author))
        {
            q = from m in q
                where m.Author.UserName == author
                select m;
        }

        ViewData["msg"] = q;

        return View();
    }

Éste es el objeto que utilizará cada vez desee el servicio de aciertos. La primera consulta que se ejecutarán con el servicio de datos tiene acceso a todos los canales disponibles. El segundo, una consulta LINQ, recupera todos los mensajes en el canal que se ha solicitado cuando el usuario ha alcanzado la página y filtros por autor si se proporcionó un nombre. Tenga en cuenta que en el código de ejemplo proporcionado, los mensajes se muestran especificando el nombre del canal y, si lo desea, el nombre del autor en el cuadro de texto y, a continuación, haciendo clic en Vista. También es importante recordar que las consultas requieren un Nombre_canal; y se no se puede ejecutar una búsqueda con nombre del autor. De las consultas mencionados anteriormente colocan en ViewData para ejecutarse como se procesa la página y, a continuación, devolver.

Ahora, en la vista de la página principal, Index.aspx, realmente se enumerar a través de las consultas, eficazmente ejecutar la consulta en el almacén de en este momento y, a continuación, se imprimirá el resultado en la página (consulte la La figura 5 ).

Vista de página principal de la figura 5 (servicio de instalaciones)

<h2>Today's Messages</h2>
    <form action="./">
        Channel:<span style="color: #FF0000">*</span> <input type="text" 
            name="channel" 
            />          
            Author: <input type="text" name="author" /><br />
        <input type="submit" value="Search" />
    </form> 
    <ul>
    <!-- Execute query placed in ViewData["msg"] - enumerates over 
        results and prints resulting message data to the screen -->
    <% foreach (var m in (Ienumerable
        <MicroBloggingOnPremise.Models.Message>)
    ViewData["msg"])
       { %>
    <li><%=m.Author.UserName%>@<%=m.DatePosted %>: <%=m.Text%> 
        [<%=m.Channel.ChannelName %>]</li>
    <%} %>
    </ul>



    <h2>Channels</h2>
    <ul>
    <!-- Execute query placed in ViewData["channels"] - enumerates over 
         results and prints resulting channel data to the screen -->
        <% foreach (var channel in 
        (IEnumerable<MicroBloggingOnPremise.Models.Channel>)
            ViewData["channels"])
           { %>

          <li><%=channel.ChannelName %> (<%=channel.DateCreated %>)</li>

        <% } %>
    </ul>

Crear, actualizar y eliminar

Para crear una nueva instancia de entidad en el servicio de datos mediante la biblioteca de cliente de servicio de datos ADO.NET, crear una nueva instancia del objeto .NET que representa el conjunto de entidad y llamar al método AddTo… para el conjunto de entidad en la instancia DataServiceContext que estoy utilizando, pasando el objeto nuevo y la entidad establecido que me agregarlo a.

Por ejemplo, vamos a buscar en la acción PostMessage del controlador de página principal, en Figura 6 , que cuando se llama al intentar enviar un mensaje haciendo clic en el botón Enviar.

Figura 6 (con instalaciones) crear un nuevo mensaje y de inserción al almacén de datos

[AcceptVerbs("POST")]
        public ActionResult PostMessage(string channel, string author, 
            string msg)
        {
            microblogEntities svc = new microblogEntities(new 
            Uri("http://localhost:50396/MicroData.svc"));

            Channel chan = (from c in svc.Channels
                    where c.ChannelName == channel
                    select c).FirstOrDefault();


            if (chan == null) throw new ArgumentException("Invalid 
                channel");

            User u = (from auth in svc.Users
                     where auth.UserName == author
                     select auth).FirstOrDefault();

            if (u == null) //throw new ArgumentException("Invalid 
                Author");
            {
                //To simplify this example we will create a new user, 
                //if the user was null when we queried. 
                //It is possible that another client creates 
                //the same UserName 
                //before we call SaveChanges() 
                //and we end up with 2 Users with the same name
                var user = new User();
                user.UserName = author;
                user.DateCreated = DateTime.UtcNow;
                svc.AddToUsers(user);
                u = user;

            }


            var m = new Message();

            m.DatePosted = DateTime.UtcNow;
            m.Text = msg;
            svc.AddToMessages(m);
            svc.SetLink(m, "Channel", chan);
            svc.SetLink(m, "Author", u);

            try
            {
                svc.SaveChanges();
            }
            catch (Exception e)
            {
                throw (e);
            }
            return this.RedirectToAction("Index");
        }

Observe que el método está decorado con el atributo AcceptVerbs("POST"), puesto que estamos utilizando para una entrada de formulario. Vuelva a iniciar creando instancias de un nuevo DataServiceContext como la entrada elija mi servicio y, a continuación, consultan el canal especificado comprobar que existe. Si el canal no existe, produce una excepción; de lo contrario, crear un nuevo mensaje, pasando de los datos introducidos por el usuario. Una vez que se ha creado el mensaje, se necesita para indicar el contexto que tiene un objeto nuevo que agregarse svc.AddToMessages(m) llamada; el nuevo objeto de mensaje, pasando m. También establece vínculos que representa las relaciones adjuntadas a este mensaje nuevo, en este caso svc.SetLink(m, "Channel", chan); asociar el mensaje con el canal y svc.SetLink(m, "Author", u) especificados; asociar el mensaje con el autor especificado. Por último, desea insertar los cambios al servicio y en la base de datos mediante una llamada a svc.SaveChanges();.

Si se modifica una instancia existente en lugar de crear una nueva, podría primero consulta para el objeto que desea actualizar, realice los cambios deseados y, en lugar de AddToMessages, se podría llama al método UpdateObject para indicar al contexto que necesita enviar una actualización para ese objeto la próxima vez que llame a SaveChanges(). De forma similar, si se elimina una instancia, una vez que tenía en el objeto, se podría llama al método Delete para indicar al contexto que desea eliminar dicho objeto.

En este ejemplo y hasta el momento en este artículo, hemos visto una única operación en el mapa de cliente a una única solicitud HTTP se envían al servicio. En muchas situaciones, también es beneficioso para el cliente poder lote de un grupo de operaciones y enviarlos al servicio en una única solicitud HTTP. Esto reduce el número de acciones de ida y vuelta al servicio y permite a un ámbito lógico de atomicidad para conjuntos de operaciones. La biblioteca de cliente de servicio de datos ADO.NET admite el envío de un grupo de insertar, actualizar, o solicitan operaciones de eliminación para un servicio en un solo HTTP mediante una llamada al método SaveChanges(), pasando SaveChangesOptions.Batch como el parámetro sólo. Este valor del parámetro indica al cliente a todos los cambios pendientes en una única solicitud HTTP enviado al servicio de lotes. Al enviar los cambios como un lote, asegúrese de que todos los cambios se completó correctamente o que ninguno de los cambios se aplicará.

Consume un servicio de datos de tabla Azure

El acceso a cuando están desarrollando una aplicación .NET mediante Windows Azure tabla, los datos se realiza mediante las bibliotecas de cliente de servicios de datos de ADO.NET. En esta sección, recorra el desarrollo de la misma aplicación simple utilizado anteriormente, pero esta vez se se tener acceso a y manipular datos almacenados en la tabla de Azure. Para el resto de este artículo, suponga que una cuenta de Windows Azure almacenamiento ya establecida y disponible para su uso. Para obtener más información sobre la introducción a Windows Azure tabla, vea la Centro de desarrollo plataforma azure Services.

El modelo de datos tabla Azure

Antes de comenzar en una aplicación, hay un par cosas que debe conocer el modelo de datos Azure tabla para obtener un mejor rendimiento. Una aplicación puede optar por crear muchas tablas dentro de una cuenta de almacenamiento en cada tabla contiene un conjunto de entidades (filas) y cada entidad contiene un conjunto de propiedades (columnas). Cada entidad se pueden tener hasta 255 propiedades, almacena como < Nombre, TypedValue > pares y se identifica mediante dos propiedades claves que juntas se convierten en el identificador único. Esta primera propiedad de clave es la PartitionKey (cadena de tipo), habilitar particiones para escalabilidad y el otro es el RowKey (también tipo cadena), que identifica la entidad en la partición. Más allá de las dos propiedades claves, no hay ningún esquema fijo para las propiedades restantes, lo que significa que la aplicación es responsable de aplicar cualquier esquema que se debe mantener.

Una de las diferencias importantes al desarrollar contra Windows Azure tabla comparado con almacenamiento de base de datos local rodea particiones. Con Azure tabla, la aplicación controla la granularidad de las particiones y partición pasa a ser muy importante para el rendimiento y la escalabilidad de la aplicación. Esto significa que la elección de la propiedad PartitionKey es muy importante y afecta al rendimiento porque la tabla clústeres entidades (localidad de entidad) con el mismo valor clave de partición. Para elegir la mejor posible PartitionKey, debe elegir la clave, que sea común a la mayoría (o todos) de las consultas utilizadas en la aplicación. Rendimiento y escalabilidad pueden también se afectados de forma similar por el número de particiones utilizado por la aplicación (número de diferentes valores de la PartitionKey); tener más particiones permite el servidor para saldo mejor la carga entre los nodos.

La biblioteca de cliente de servicios de datos ADO.NET

Ahora se cree la misma aplicación de Microsoft-creación de un blog, utilizando el controlador de vista de modo de ASP.NET (MVC) y este tiempo detallará algunas de las preguntas que suelen surgen al creación de aplicaciones con los datos almacenados en Windows Azure tabla.

Forma similar a la base de datos en las instalaciones, esto se requiere tres entidades en el modelo, que se traduce en tres tablas: una tabla de mensajes, una tabla de canales y una tabla de usuarios, todos están configurados en mi cuenta de almacenamiento.

A lo largo de la aplicación se hacer uso de la StorageClient ejemplo que se incluye en el SDK de Azure de Windows. En el ejemplo de StorageClient implementa una biblioteca que puede utilizar para tener acceso el servicio de almacenamiento Windows Azure blob, servicio de cola y el servicio de almacenamiento de la tabla. VOY a utilizar la biblioteca para ayudarme a tener acceso al servicio de almacenamiento de tabla. El SDK de Azure Windows se puede descargar desde el Azure plataforma Centro de desarrollo Services citado anteriormente.

Para empezar, creará una nueva aplicación de Web de MVC de ASP.NET mediante la plantilla Visual Studio instalado con ASP.NET MVC y agregar el proyecto StorageClient del SDK de Azure Windows a la solución.

Definir el modelo en el cliente

El primer paso en la creación de la aplicación es para definir las clases que se utilizará en el cliente para representar las entidades expuestas por el servicio. Dado que Azure tabla no tiene un esquema fijo, no puede utilizar el Asistente para agregar referencia del servicio como hice con el servicio en las instalaciones. Sin embargo, como se mencionó anteriormente, puede crear Mis propio clases POCO. Estas clases con eficacia se utilizará para definir el esquema de la aplicación, como tabla Azure no exige cualquier esquema en el lado del servidor. Se definen una clase de mensaje, una clase de canal y una clase de usuario para alinearse con los EntityTypes expuestos por el servicio. Para empezar, agregar un nuevo archivo de código, MicroData.cs, a la carpeta de modelos donde definirá mis clases. Estas clases se definirá en el espacio de nombres MicroBloggingAzure.Models.

Si echa un vistazo a la clase de mensajes que se muestra en la figura 7 , puede ver que han definido tanto un PartitionKey un RowKey según Azure tabla. Se trata de un cambio de lo que vio en el servicio en las instalaciones ya que son específicos de Windows Azure tabla. Merece la pena destacar que las recomendaciones para la determinación de claves no se recomiendan en almacenamiento relacional y nube y en mis aplicaciones de ejemplo ha utilizado la determinación de claves más apropiada para cada origen de datos en lugar de intentar alinear las dos de ninguna manera. El PartitionKey y la RowKey son simplemente definido como cadena de tipo y identificado mediante convenciones de nomenclatura (que, llama a PartitionKey y RowKey). En el caso de esta aplicación, el PartitionKey está formado por el nombre del canal al que se contabiliza el mensaje, concatenada con un " @" y la fecha el mensaje se ha contabilizado en el formato" aaaa-mm-dd ". El RowKey es una representación cadena de la fecha que se envió el mensaje. Se ha elegido esta PartitionKey tal que la aplicación puede recuperar eficazmente los mensajes que se contabilizaron recientemente a un canal concreto. Para empezar, ha elegido mostrar sólo las entradas de hoy cuando se tiene acceso a un canal; sin embargo, si mi aplicación pasa a ser muy popular y recibe miles de entradas de un día, esta clave se puede fácilmente modificar en partición más granularly, por ejemplo, al agregar un componente de tiempo (horas, quizás,). De forma similar, si mi aplicación no es tan ocupada como previsto, podría modificar la PartitionKey en partición por mes en lugar de por día. A continuación, han identificado las dos propiedades claves como una forma única identificación DataServiceKey, que se lleva a cabo mediante agregar el atributo DataServiceKey a la clase. La clase de mensajes también define un número de otras propiedades que contiene información sobre el mensaje, una parte de las claves necesarias. Todas las propiedades asociadas con la entidad de mensaje se almacenará en tabla Azure. Las clases de usuario y Channel se crean después de los mismos principios como la clase de mensaje.

Definición de entidad de mensaje en la figura 7

[DataServiceKey("PartitionKey", "RowKey")]
    public class Message
    {
        // ParitionKey is channel name [+ day]
        public string PartitionKey { get; set; }
        // Date/Time when the message was created
        public string RowKey { get; set; }

        public string Text { get; set; }
        public string Author { get; set; }
        public string Channel { get; set; }
        public DateTime DatePosted { get; set; }
        public int Rating { get; set; }

        public Message()
        {
        }

        public Message(string channel, string author, string text)
        {
            this.Text = text;
            this.Author = author;
            this.Channel = channel;
            this.DatePosted = DateTime.UtcNow;

            this.PartitionKey = MakeKey(this.Channel, this.DatePosted);
            this.RowKey = System.Xml.XmlConvert.ToString(
               this.DatePosted);
        }
        public static string MakeKey(string channel, DateTime dt)
        {
            return channel + "@" + dt.ToString("yyyy-MM-dd");
        }
    }

Crear una tabla

Una vez mis clases de entidad se han definido, puede empezar a desarrollar realmente la aplicación. Pero es en primer lugar, necesario agregar mi información de acceso Azure tabla cuenta en Web.config, como se muestra aquí:

<appSettings>
  <add key="TableStorageEndpoint"        value="http://table.core.windows.net/"/>
  <add key="AccountName" value="<MyAccountName>"/>
  <add key="AccountSharedKey" value="<MyAccountSharedKey-Provided when        you register for Azure Tables>"/>
</appSettings> 

Aunque esto no es la única forma de pasar información de cuenta al desarrollar Azure tabla contra la tabla, esto permite que el SDK de Azure se usa para seleccionar mi configuración de cuenta y tratar con las conexiones a los orígenes de datos automáticamente.

A menudo las aplicaciones escritas Windows Azure tabla contra la tabla, la creación de tablas requerida por la aplicación se hace mediante programación dentro de la aplicación. Esto es un poco diferente de cómo una normalmente haría cosas con una de las instalaciones de almacén de datos, donde las tablas se crean por separado en la base de datos y la aplicación simplemente interactúa con ellos.

Una manera de crear las tablas requiere mediante programación crear simplemente una entidad nueva en la tabla maestra llamaría tablas. Todas las tablas que cree en su cuenta de almacenamiento deben estar representada como una entidad en la tabla principal, que está predefinida al registrar su cuenta. Para esta aplicación, sin embargo, utilizará el StorageClient, que proporciona funcionalidad para comprobar, en la inicialización de aplicación, que las tablas necesarias existen en la cuenta de almacenamiento, y si no existen, creará los.

Mediante la creación de las tablas mediante programación dentro de la aplicación, simplifican el proceso mediante el cual pueden reflejar actualizaciones al modelo de en el almacén de datos. Por ejemplo, si hacia abajo de la carretera agrega la capacidad de un usuario para suscribirse a un canal y agregar una entidad de suscripción al modelo, la tabla asociada se agregará automáticamente en el almacén de datos la próxima vez que inicie la aplicación. Esta opción también garantiza que si se distribuye la aplicación para su uso con cuentas diferentes tablas Azure, todo el usuario necesita hacer es escribir su información de acceso de la cuenta y las tablas están configuradas correctamente y listo para su uso cuando se ejecuta la aplicación.

Si tiene los datos existentes ya en la tabla Azure o si no tiene control sobre las tablas en Azure, puede omitir el paso de creación de tablas totalmente y simplemente para programar las tablas existentes.

Para comprobar y crear las tablas en mi aplicación, se utiliza el método de TableStorage.CreateTablesFromModel() que está una parte de la biblioteca StorageClient, tal como muestra aquí:

protected void Application_Start()
{
       RegisterRoutes(RouteTable.Routes); //MVC Routing Rules

       TableStorage.CreateTablesFromModel (typeof(Models.MicroData));
}  

Consultar datos

Con mi aplicación configurar para tener acceso a mi cuenta en las tablas de Azure, el resto de funciona como si se tener acceso a un servicio en las instalaciones. Al igual que con el servicio en las instalaciones, puesto que ESTOY utilizando la biblioteca de cliente el servicio de datos ADO.NET, estoy pueda para trabajar fácilmente con los datos como objetos de .NET y para realizar consultas mediante LINQ (consulte la figura 8 ).

Figura 8 acceso A datos como objetos de .NET con LINQ de nuevo

public ActionResult Index(string channel, string author)
        {
            var svc = new Models.MicroData();
            ViewData["channels"] = svc.Channels;

            var q = from m in svc.Messages
                    where m.PartitionKey == Models.Message.
                       MakeKey(channel, DateTime.UtcNow)
                    select m;
            if (!string.IsNullOrEmpty(author))
            {
                q = from m in q
                    where m.Author == author
                    select m;
            }

            ViewData["msg"] = q;

            return View();
        }

En la figura 8 , verá la acción de índice del controlador de página principal. Dentro de esta acción, crear una nueva instancia de mi DataServiceContext (MicroData hereda de TableStorageDataServiceContext), el objeto utilice para obtener acceso al servicio y escribir las consultas para ejecutarse con el servicio de datos. A continuación, recuperar una lista de todos los canales disponibles desde el servicio de datos y escribir la consulta LINQ para recuperar todos los mensajes de hoy, filtrado en función de entrada de usuario (canal y, posiblemente, autor si proporciona). Coloque ambas consultas en ViewData para ejecutarse como se procesa la página y, a continuación, devolver. Observe que el modelo aquí es el mismo que cuando tiene acceso al origen de datos en las instalaciones; crear una nueva instancia de DataServiceContext y realizar consulta usando simples consultas LINQ en el modelo.

En la vista de la página principal (Index.aspx en Figura 9 ), Enumerar a través de Mis consultas, ejecutar las consultas en el almacén e imprimir los resultados a la página.

Vista de página principal de la figura 9

<h2>Today's Messages</h2>
    <form action="./">
        Channel:<span style="color: #FF0000">*</span> <input type="text" 
        name="channel" /><br />
        Author: <input type="text" name="author" /><br />
        <input type="submit" value="View" />
    </form> 
    <ul>
    <!-- Execute query placed in ViewData["msg"] - enumerates over 
         results and prints resulting message data to the screen -->
    <% foreach (var m in (IEnumerable<MicroBloggingAzure.Models.Message>)
       ViewData["msg"])
       { %>
    <li><%=m.Author%>@<%=m.DatePosted %>: <%=m.Text%> [<%=m.Channel %>]
    </li>
    <%} %>
    </ul>


   <h2>Channels</h2>

    <ul>
    <!-- Execute query placed in ViewData["channels"] - enumerates over 
    Results and prints resulting channel data to the screen -->
        <% foreach (var channel in 
        (IEnumerable<MicroBloggingAzure.Models.Channel>)
        ViewData["channels"])
        { %>

          <li><%=channel.PartitionKey %> (<%=channel.DateCreated %>)</li>

        <% } %>
       </ul>

Crear, actualizar y eliminar

Crear una nueva entidad en el servicio de tabla mediante la biblioteca de cliente el servicio de datos ADO.NET, como si estuviera trabajando en un almacén en las instalaciones, se realiza mediante crear una nueva instancia del objeto .NET que representa el conjunto de entidad y llamar a AddObject().

Echemos un vistazo a la acción PostMessage del controlador de la página principal, en Figura 10 .

Figura 10 crear nuevo mensaje y de inserción al almacén de datos

[AcceptVerbs("POST")]
        public ActionResult PostMessage(string channel, string author, string msg)
        {
            var svc = new Models.MicroData();

            var q = from c in svc.Channels
                    where c.PartitionKey == channel
                    select c;

            if (q.FirstOrDefault() == null) throw new
            ArgumentException("Invalid channel");

            User u = (from auth in svc.Users
                     where auth.UserName == author
                     select auth).FirstOrDefault();

            if (u == null)
            //throw new ArgumentException("Invalid Author");
            {
                var user = new User();
                user.UserName = author;
                user.DateCreated = DateTime.UtcNow;
                user.PartitionKey = user.UserName;
                user.RowKey = string.Empty;
                svc.AddObject("Users", user);
                u = user;
            }

            var m = new Models.Message(channel, author, msg);
            svc.AddObject("Messages", m);

            svc.SaveChanges();

            return this.RedirectToAction("Index");
        }

Igual que hizo que para consultar el servicio de datos, instancia un nuevo DataServiceContext como el punto de entrada y la consulta para el canal especificado para comprobar que existe, produce una excepción si no se encuentra. PUEDO crear un nuevo mensaje, pasando el usuario de entrada. Una vez que se ha creado el mensaje, indique el contexto que tiene un objeto nuevo que se agrega por llamada svc.AddObject ("mensajes", m); pasar en el nombre del EntitySet que está agregando a, "mensajes" y nuevo objeto de mensaje, m. Por último, desea insertar los cambios en el servicio de tabla mediante una llamada a svc.SaveChanges();.

Hay un par de las diferencias que puede que observe aquí. El primero es debido a la falta de un esquema fijo en tabla Azure. Esta falta de esquema significa que los no tienen datos con establecimiento inflexible de tipos y llame debe al AddObject() sin tipo en la DataServiceContext instancia, pasando el objeto nuevo y la entidad establecer que me agregarla, en lugar de almacenan los métodos AddTo…() con tipo que utiliza con la de las instalaciones. Cabe destacar aquí que el método más genérico de AddObject() está todavía disponible en el escenario en las instalaciones; sin embargo, en mi ejemplo utilizar los métodos con establecimiento inflexible de tipos para aprovechar el tiempo de compilación de comprobación y así sucesivamente.

La diferencia de segunda, también algo atribuir a la falta de esquema fijo, es la falta de un concepto de primera clase de relación. En primer lugar verá esto en las diferencias entre cómo estructura de los datos de tabla Azure comparado con el origen de datos en las instalaciones. En la acción PostMessage observará que no está estableciendo vínculos en el nuevo objeto; en su lugar, se almacena ninguna información de relación directamente como propiedades en Mis entidades.

Si se modifica una instancia existente en lugar de crear una nueva, podría primero consulta para el objeto que desea actualizar, realice los cambios deseados y, por último, en lugar de AddObject, se podría llama al método UpdateObject para indicar al contexto que necesita enviar una actualización para ese objeto en la siguiente vez que llama SaveChanges(), como si tratase de un servicio de datos en las instalaciones. De forma similar, eliminar una instancia llamando al método Delete para indicar al contexto que desea eliminar dicho objeto, es también el mismo si me tener acceso a un servicio de tabla Azure o mi propio servicio en las instalaciones.

Sumar hacia arriba

Mira estos dos ejemplos juntos, se puede ver cómo simple el movimiento entre el desarrollo con un servicio en la premisa y se un servicio de tabla Azure se realiza mediante el uso de la misma simple ADO.NET servicios cliente biblioteca de datos. La curva de aprendizaje que es bastante plana si también son responsable de administrar cada origen de datos y principalmente consta de un turno de pensamiento entre el modelo de almacenamiento relacional y el modelo de tabla Azure más sin estructurar, así como un conocimiento del modelo Azure tabla PartitionKey y RowKey. Si se centran principalmente en el desarrollo de aplicaciones frente a estos servicios, los conocimientos que construir desarrollar con un servicio son transferibles al desarrollo con cualquier otro servicio de datos.

Elisa Flasko es un administrador de programas en el equipo de programación de datos en Microsoft, incluidas la tecnologías ADO.NET, tecnologías y las tecnologías de conectividad de SQL Server. Puede ponerse en blogs.msdn.com/elisaj.