Saltar al contenido

Cómo crear un índice agrupado con Entity Framework Core

Queremos proponerte la mejor información que encontramos on line. Nosotros deseamos que te sirva de ayuda y si deseas comentarnos alguna mejora hazlo con libertad.

De la documentación actual de EF Core – Sección de índices:

Anotaciones de datos

Los índices no se pueden crear utilizando anotaciones de datos.

Pero seguro que puede especificar eso a través de Fluent API (tenga en cuenta los métodos de extensión que tienen ForSqlServer prefix que parecen denotar características específicas de SqlServer):

modelBuilder.Entity()
    .HasIndex(e => e.UserName)
    .IsUnique()
    .ForSqlServerIsClustered();

Actualizar: para EF Core 3.0+, el método se llama simplemente IsClustered:

modelBuilder.Entity()
    .HasIndex(e => e.UserName)
    .IsUnique()
    .IsClustered();

Para EF Core 3.0+, ahora puede usar IsClustered:

modelBuilder.Entity()
.HasIndex(e => e.UserName)
.IsUnique()
.IsClustered();

.ForSqlServerIsClustered() ahora está marcado como obsoleto.

También tenga en cuenta que si tiene una clave principal en la tabla, es posible que también deba eliminar explícitamente el agrupamiento antes de agregar el agrupamiento en su nombre de usuario:

modelBuilder.Entity()
.HasKey(e => e.PersonId)
.IsClustered(false);

modelBuilder.Entity()
.HasIndex(e => e.UserName)
.IsUnique()
.IsClustered();

En ausencia de soporte integrado, puede utilizar un personalizado attribute propias para anotar las propiedades del modelo y aplicarlas en OnModelCreating():

protected override void OnModelCreating(ModelBuilder modelBuilder)

    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    
        foreach (var prop in entity.GetProperties())
        
            var attr = prop.PropertyInfo.GetCustomAttribute();
            if (attr != null)
            
                var index = entity.AddIndex(prop);
                index.IsUnique = attr.IsUnique;
                index.SqlServer().IsClustered = attr.IsClustered;
            
        
    

Con un marcador sencillo attribute clase:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class IndexAttribute : Attribute

    public bool IsUnique  get; set;  
    public bool IsClustered  get; set;  

Luego, en su clase de modelo, simplemente agregue el attribute para crear un índice secundario:

public class User

    public int UserId  get; set; 
    [Index(IsUnique = true, IsClustered = true)]
    public string Nickname  get; set; 

Si te sientes incitado, tienes el poder dejar una crónica acerca de qué te ha gustado de este tutorial.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *