Windows Azure Table Storage
En las entradas cloud computing y publicar en Windows Azure comentamos las posibilidades del entorno de computación en la nube de Microsoft, así como migrar una aplicación web a este entorno usando Sql Azure. Gracias a que Windows Azure por un lado mejora los precios para tener una cuenta de computación en la nube con ellos y mantiene su promoción de prueba (incluso aumentando el tiempo de instancia de computación mensual) es tentador ponerse a ver como migrar una aplicación a este entorno de producción. Anteriormente se describió en publicar en Windows Azure los pasos a seguir para tener una aplicación web en este entorno de producción. Además hacíamos uso de Sql Azure, aunque la web que migramos telecentros no hace uso intenso de base de datos. Para esta entrada queremos usar table storage, ya que partiremos de la aplicación ffvoileclient que ya parte de una estrutura de datos en entities. No nos hace falta crear índices, claves externas ni usar joins, por lo que es un buena candidato a usar table storage. Sólo hay que tener en cuenta a la hora de crear la entity y context que nos define la estructura de datos, implementar las clases del Windows Azure Storage, TableServiceEntity y TableServiceContext. Si tenemos instalado el Visual Studio Tools Kit iniciamos Visual Studio, creamos un proyecto Window Azure y agregamos un Web Role.El proyecto que vamos a migrar ffvoileclient tiene ya definida la clase con la estructura de datos que usamos:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.WindowsAzure.StorageClient; namespace voileWR { public class licencieEnt : TableServiceEntity { public licencieEnt(string pk, string rk) : base(pk, rk) { } public licencieEnt() : base(new Guid().ToString(), new Guid().ToString()) { } private string _nombreemp; private string _direccion; private string _telefono; private string _personacont; private int _ident; public int Ident { get { return _ident; } set { _ident = value; } } public string NombreEmp { get { return _nombreemp; } set { _nombreemp = value; } } public string Direccion { get { return _direccion; } set { _direccion = value; } } public string Telefono { get { return _telefono; } set { _telefono = value; } } public string PersonaCont { get { return _personacont; } set { _personacont = value; } } } }
Las líneas sombreadas destacamos el Namespace necesario a incluir (5) y en la (11) los atributos que debemos inicializar PartitionKey y RowKey para localizar los registros en el Windows Storage.
Al igual que cuando se trabaja en otro proyecto con entity es necesario el context para enlazar con el origen de datos. La única diferencia son las clases que deben implementarse.
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.WindowsAzure.StorageClient; using Microsoft.WindowsAzure; namespace voileWR { public class context : TableServiceContext { public context(string ba, StorageCredentials sc) : base(ba, sc) { } public string TableName = "licencies"; public IQueryable<licencieEnt> licencies { get { return this.CreateQuery<licencieEnt>(TableName); } } } }
Además vemos en la línea 11 que pasamos las credenciales de nuestra cuenta en Windows Azure. Para recuperar e introducir datos creamos procedimientos que usando linq nos dan la funcionalidad de recuperar, introducir los datos. Después usando por ejemplo un gridview, pasaremos como objectdatasource el origen de datos que nos permite enlazarlos.
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; namespace voileWR { public class DataSource { context _contexto; public DataSource() { var sa = CloudStorageAccount.DevelopmentStorageAccount; _contexto = new context(sa.TableEndpoint.ToString(), sa.Credentials); var ctc = sa.CreateCloudTableClient(); ctc.CreateTableIfNotExist(_contexto.TableName); } public IEnumerable<licencieEnt> Select() { var resultado = from c in _contexto.licencies select c; var query = resultado.AsTableServiceQuery<licencieEnt>(); var queryResults = query.Execute(); return queryResults; } public void Delete(licencieEnt itemBorrar) { _contexto.AttachTo(_contexto.TableName, itemBorrar, "*"); _contexto.DeleteObject(itemBorrar); _contexto.SaveChanges(); } public void Insert(licencieEnt itemNuevo) { _contexto.AddObject(_contexto.TableName, itemNuevo); _contexto.SaveChanges(); } } }
Una vez comprobado que el proyecto funciona correctamente, queda crear la cuenta en Windows Azure y publicar.