Usando Enumeraciones en Entity Framework 5.0

Introducción

Es bastante probable que en alguna de las tablas de vuestras bases de datos tengas alguna propiedad de tipo Integer para representar una clave ajena de una tabla que no suele cambiar.

¿Por qué no utilizar una enumeración en lugar de otra tabla en la Base de Datos?

Bien, con Entity Framework 5.0 Beta 1 podemos hacer uso de enumeraciones en nuestras entidades sin tener que hacer ninguna chapuza. Esta versión es para VS11 con .NET 4.5. El trabajo con Enums ya se pudo probar con una CTP que salio en Junio de 2011 con Database First y Model First, pero no con Code First.

En este post vamos a ver como realizarlo en los distintos enfoques existentes.

 

Database First y Model First

Ya que Database First y Model First son dos enfoques muy similares vamos a tratarlos en común.

Para empezar:

1) Definiremos un nuevo proyecto, por ejemplo: una aplicación de consola.

2) Agregaremos nuestro Entity Data Model indicando nuestra Base de Datos y tablas.

3) Dentro del explorador del modelo de nuestro diagrama, veremos una nueva carpeta “Enum Types”. Pulsaremos con el botón secundario del ratón, y elegiremos la opción “Add Enum Type”. Configuraremos las características: Nombre, tipo de dato, y los miembros:

 

 

4) Asignación de la enumeración a una propiedad escalar: Desde la ventana de propiedades

 

Code First

Para usarlo seguiremos estos pasos:

1) Definiremos nuestra enumeración:

   1: public enum Category

   2: {

   3:     Technology,

   4:     Computer,

   5:     Games

   6: }

2) Definiremos nuestra entidad:

   1: public class Products

   2: {

   3:     public int Id {get;set;}

   4:     public string Name {get;set;}

   5:     public Category Category {get;set;}

   6: }

3) Incluiremos la colección en nuestro contexto:

   1: public class Context : DbContext

   2: {

   3:     public DbSet<Product> Products {get;set;}

   4: }

4) En el momento de la definición de la Base de Datos va a definir una columna llamada Category de tipo Integer en nuestra Base de Datos.

 

Haciendo Consultas

Como las enumeraciones no estaban soportadas en versiones anteriores para poder utilizar la enumeración teniamos que obtener el código que nos interesaba.

En esta nueva versión podremos realizar la siguiente consulta:

   1: var query = context.Products.Where(a=> a.Category == Category.Games);

 

Saludos!

[TIP] Exportar Word a PDF desde Código

Mini artículo para exportar un fichero word a PDF desde código c# y VB.NET.

Al Lio

Para poder trabajar con documentos de Word en nuestro código es necesario que agreguemos la referencia “Microsoft.Office.Interop.Word.dll”.

Sin mas dilación el código:

VB.NET

   1: Dim app As New Microsoft.Office.Interop.Word.Application()

   2:  

   3:         Dim missing As Object = System.Type.Missing

   4:         Try

   5:  

   6:                 Dim document As Microsoft.Office.Interop.Word.Document = app.Documents.Open(RutaCarta)

   7:                 Dim nombre As String = String.Format("{0}TEMPName.doc", Application.StartupPath)

   8:  

   9:                 app.Visible = False

  10:                 

  11:                 app.ActiveDocument.ExportAsFixedFormat(String.Format("{0}Name.pdf", Application.StartupPath), & _

  12:                      Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF, False, & _

  13:                         Microsoft.Office.Interop.Word.WdExportOptimizeFor.wdExportOptimizeForPrint, & _

  14:                     Microsoft.Office.Interop.Word.WdExportRange.wdExportAllDocument)

  15:                 document.Close()

  16:    

  17:         Catch ex As Exception

  18: 'Manejar la excepción....

  19:         Finally

  20:  

  21:             app.Quit()

  22:  

  23:         End Try

 

C#

 

   1: var app = New Microsoft.Office.Interop.Word.Application()

   2: var missing = System.Type.Missing

   3: try

   4: {

   5:     var document = app.Documents.Open(RutaCarta);

   6:     string nombre = String.Format("{0}TEMPName.doc", Application.StartupPath);

   7:     app.Visible = false;

   8:                 

   9:        app.ActiveDocument.ExportAsFixedFormat(String.Format("{0}Name.pdf", Application.StartupPath), 

  10:                      Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF, False, 

  11:                         Microsoft.Office.Interop.Word.WdExportOptimizeFor.wdExportOptimizeForPrint, 

  12:                     Microsoft.Office.Interop.Word.WdExportRange.wdExportAllDocument);

  13:                 document.Close();

  14: }

  15: catch(Exception ex)

  16: {

  17: 'Manejar la excepción....

  18:  }

  19: finally

  20: {

  21:     app.Quit();

  22: }

Gracias al método ExportAsFixedFormat, podremos exportar nuestro fichero Word a formato PDF o XPS…

…PERO!!!:

Podremos encontrarnos una excepción que nos dirá algo así: “Esta funcionalidad no está instalada.”.

Para poder ejecutar de forma correcta este código, necesitamos instalar un addin de Office.

 

Espero que os sea de utilidad.

 

Saludos!!!

DbMigration y Code First

Introducción

Una de las novedades que se introdujo con la versión 4.3 de Entity Framework son las llamadas Database Migration (DbMigration), que vienen a satisfacer las necesidades de los desarrolladores a la hora de realizar cambios en la estructura de la base de datos, como por ejemplo:

– Creación o borrado de Tablas.

– Cambiar o quitar columnas.

– entre otras cosas 🙂

La principal problemática venía a la hora de tener nuestra aplicación instalada en varios clientes y que tengan distintas versiones de Base de Datos.

Empezando

Para poder empezar a utilizar DbMigration es necesario que al “menos” tengamos instalada la versión 4.3.1(*) de Entity Framework, si no podremos instalarla desde nuget o desde la consola de comandos:

   1: Install-Package EntityFramework 

(*) Se encuentra en fase beta la version  5.0 de Entity Framework.

 

A continuación desde la consola de comandos, tendremos que especificar la habilitación de migraciones para nuestro proyecto, para ello ejecutaremos el comando “Enable-Migrations”.

Esta acción va a realizar los siguientes procesos:

– Va a buscar una clase dentro de nuestro proyecto que implemente la clase DBContext, para utilizar dicho contexto a la hora de definir las migraciones.

– Va a crear una nueva carpeta “Migrations” en nuestro proyecto. Esta carpeta va a contener los siguientes ficheros:

  1.  
    1. Clase Configuration.cs: Esta clase va a ser una implementación de la clase base genérica DbMigrationsConfiguration con nuestro objeto contexto.
      Dentro de ella, vamos a poder definir la configuración de la migración (en el constructor) y si hay que hacer algun proceso de llenado de información (método Seed).
    2. Una Migración Inicial: va a definir una clase que implemente la clase Base DbMigration, donde tendremos el método Up con la creación de nuestras entidades, y el método Down con el borrado de las mismas. La implementación de las migraciones se realiza en dos partes, la primera es la que acabamos de ver, y la segunda es relativa a información que se va a almacenar en la Base de Datos.

– Va a crear una tabla dentro de nuestra Base de Datos  llamada __MigrationHistory que va a almacenar información relativa a las migraciones.

 

¿Cómo crear una Migración?

Bien para crear una nueva migración desde la consola de comandos ejecutaremos la siguiente instrucción:

“Add-Migration Name”

Al ejecutarlo, se va a generar una nueva clase dentro de la carpeta Migrations, con una estructura similar a la mencionada anteriormente con la migración inicial.

Dentro de dicha clase vamos a tener que implementar los métodos Up, para subir de versión, y Down para bajar de versión.

¿Qué Métodos podemos utilizar en los métodos Up y Down?

AddColumn AddForeignKey AddPrimaryKey
AlterColumn CreateIndex CreateTable<T>
DropColumn DropForeignKey DropPrimaryKey
DropIndex DropTable MoveTable
RenameColumn RenameTable SQL

Ejemplo:

   1: public partial class ProductMigration : DbMigration

   2:     {

   3:         public override void Up()

   4:         {

   5:             CreateTable("Products",

   6:                 columns => new

   7:                 {

   8:                     ProductId = columns.Int(identity: true),

   9:                     Name = columns.String(maxLength: 100),

  10:                     Description = columns.String(),

  11:                     Price = columns.Decimal(precision: 10, scale: 2)

  12:                 });

  13:         }

  14:         

  15:         public override void Down()

  16:         {

  17:             DropTable("Products");

  18:         }

  19:     }

¿Cómo actualizar la Base de Datos?

Para poder ejecutar una migración tenemos dos posibles formas:

1) Desde la consola de Comandos:

A través del comando “Update-Database”. Los parámetros del comando son:

– SourceMigration <String>
– TargetMigration <String>
– Script [<SwitchParameter>]
– Force [<SwitchParameter>]
– ProjectName <String>
– StartUpProjectName <String>
– ConfigurationTypeName <String>
– ConnectionStringName <String>
– ConnectionString <String>
– ConnectionProviderName <String>
  

2) Desde código:

Definiremos un objeto del tipo Configuration, otro del tipo DbMigrator, y ejecutaremos el método Update:

   1: var config = new Migrations.Configuration();

   2:             var migrator = new DbMigrator(config);

   3:             migrator.Update();

Esta acción va a ejecutar la actualización a la ultima versión de la Base de Datos. En el caso de desear ejecutar una migración concreta o volver a una versión determinada, ejecutaríamos de la siguiente manera:

   1: var config = new Migrations.Configuration();

   2: var migrator = new DbMigrator(config);

   3: migrator.Update("201203140720163_InitialCreate");

 

 

Espero que os resulte de utilidad.

 

Saludos!

WebCast Entity Framework

Buenos Tardes,

El viernes pasado iba a realizar un evento online acerca de Entity Framework, por motivos ajenos a GuseNET no pudimos realizar dicho evento de forma online.

Lo primero a todos los que estabais interesados en verlo, Lo siento!!

Voy a realizarlo como tenia previsto este Viernes 09 de Marzo a las 16:30 hora de Madrid.

El enlace de registro:https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032508198&Culture=es-ES

Un saludo