IndexAttribute en Entity Famework 6.1

jueves, 28 de agosto de 2014

Logo Entity Framework

Con la versión 6.1 de Entity Framework se ha añadido un nuevo data annotation IndexAttibute, lo que nos va a permitir, al usar Code First, crear indices en la base de datos si se lo añadimos a propiedades del modelo de dominio.

En el modelo directamente

Indice columna simple

Podemos usar IndexAttribute directamente en la propiedad de una entidad.
[Index]
public string Name { get; set; }

Si no indicamos un tamaño máximo de la propiedad, por convección va a crear el campo de tipo nvarchar(max) y no se puede crear un indice para un max. Tendremos que indicarle un tamaño máximo, de lo contrario al crear la base de datos nos dará un error.

[MaxLength(200)]
[Index]
public string Name { get; set; }

El nombre por defecto del índice será con el prefijo IX_ y el nombre de la propiedad, pero también podemos especificar un nombre para el indice o indicarle si debe ser único.

[MaxLength(200)]
[Index("IX_Name",IsUnique=true)]
public string Name { get; set; }

Indice multiples columnas

Si queremos que el índice este compuesto por varias columnas, podemos añadir el IndexAttribute con el mismo nombre en diferentes propiedades, indicado el orden que tendrá el campo en el índice.

[MaxLength(200)]
[Index("IX_Name_Keywords",IsUnique=true,Order=1)]
public string Name { get; set; }

[MaxLength(250)]
[Index("IX_Name_Keywords", IsUnique = true, Order=2)]
public string Keywords { get; set; }

Usando Fluent Api

Index no existe en fluent api como una propiedad directa de StringPropertyConfiguration como puede se IsUnicode o IsRequired, sin embargo podemos añadirlo a través de HasColumnAnnotation.

Indice columna simple

modelBuilder.Entity().Property(c => c.Name).HasMaxLength(200)
    .HasColumnAnnotation(
        "Index",
        new IndexAnnotation(new[] 
            { 
                new IndexAttribute("IX_Name") { IsUnique = true,Order=0 } 
            }));

Indice multiples columnas

modelBuilder.Entity().Property(c => c.Name).HasMaxLength(200)
    .HasColumnAnnotation(
        "Index",
        new IndexAnnotation(new[] 
            { 
                new IndexAttribute("IX_Name_Keywords") { IsUnique = true,Order=1 } 
            }));

modelBuilder.Entity().Property(c => c.Keywords).HasMaxLength(250)
    .HasColumnAnnotation(
        "Index",
        new IndexAnnotation(new[] 
                        { 
                            new IndexAttribute("IX_Name_Keywords") { IsUnique = true, Order = 2} 
                        }));

Resumen

Hemos visto que existe un nuevo atributo en EF 6.1 para generar índices mediante Code First en la base de datos.

Se puede utilizar mediante el marcado en el modelo de dominio directamente y también en Fluent Api añadiendo una anotación a la propiedad.

Libros relacionados

Programming Entity Framework: DbContext

Programming Entity Framework: Code First

No hay comentarios:

Publicar un comentario