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.
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.
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.
[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
Programming Entity Framework: Code First
No hay comentarios:
Publicar un comentario