Posteriormente a consultar especialistas en este tema, programadores de deferentes áreas y maestros dimos con la solución al problema y la compartimos en esta publicación.
Solución:
Bueno, el 26 de octubre de 2017 se lanzó oficialmente Entity Framework 6.2. Incluye la posibilidad de definir índices con facilidad a través de Fluent API. Cómo se va a utilizar ya se anunció en la beta de 6.2.
Ahora puedes usar el HasIndex()
método, seguido de IsUnique()
si debe ser un índice único.
Solo una pequeña comparación (antes/después) de ejemplo:
// before
modelBuilder.Entity()
.Property(e => e.Name)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute IsUnique = true ));
// after
modelBuilder.Entity()
.HasIndex(p => p.Name)
.IsUnique();
// multi column index
modelBuilder.Entity()
.HasIndex(p => new p.Name, p.Firstname )
.IsUnique();
También es posible marcar el índice como agrupado con .IsClustered()
.
EDITAR #1
Se agregó un ejemplo para el índice de varias columnas e información adicional sobre cómo marcar un índice como agrupado.
EDITAR #2
Como información adicional, en EF Core 2.1 es exactamente igual que en EF 6.2 ahora.
Aquí está el artículo de MS Doc como referencia.
Actualmente no hay “soporte de primera clase” para crear un índice a través de la API fluida, pero lo que puede hacer es a través de la API fluida, puede marcar las propiedades como si tuvieran attributes de la API de anotaciones. Esto le permitirá agregar la Index
attribute a través de una interfaz fluida.
Estos son algunos ejemplos del elemento de trabajo del sitio de problemas para EF.
Cree un índice en una sola columna:
modelBuilder.Entity()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute()));
Múltiples índices en una sola columna:
modelBuilder.Entity()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
new IndexAttribute("Index1"),
new IndexAttribute("Index2") IsUnique = true
));
Índices de varias columnas:
modelBuilder.Entity()
.Property(e => e.MyProperty1)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute("MyIndex", 1)));
modelBuilder.Entity()
.Property(e => e.MyProperty2)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute("MyIndex", 2)));
El uso de las técnicas anteriores causará .CreateIndex()
llamadas que se crearán automáticamente para usted en su Up()
funcione cuando realice un andamiaje en su próxima migración (o se cree automáticamente en la base de datos si no está utilizando migraciones).
Creé algunos métodos de extensión y los envolví en un paquete nuget para que esto sea mucho más fácil.
Instala el EntityFramework.IndexingExtensions
paquete nuget
Entonces puedes hacer lo siguiente:
public class MyDataContext : DbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Entity()
.HasIndex("IX_Customers_Name", // Provide the index name.
e => e.Property(x => x.LastName), // Specify at least one column.
e => e.Property(x => x.FirstName)) // Multiple columns as desired.
.HasIndex("IX_Customers_EmailAddress", // Supports fluent chaining for more indexes.
IndexOptions.Unique, // Supports flags for unique and clustered.
e => e.Property(x => x.EmailAddress));
El proyecto y el código fuente están aquí. ¡Disfrutar!
Sección de Reseñas y Valoraciones
Si entiendes que ha sido útil este artículo, sería de mucha ayuda si lo compartieras con otros juniors de esta forma contrubuyes a dar difusión a nuestro contenido.