1
votes

Comment créer plusieurs index à l'aide de l'API EF Core fluent?

étrangement, je n'ai trouvé aucun exemple ni aucune mention à ce sujet. Je voudrais définir des index sur deux de mes colonnes (pas un index composite, juste deux index séparés) en utilisant l'API fluent.

Par exemple, je me demandais s'il était possible de faire quelque chose comme:

modelBuilder.Entity<T>
            .HasIndex(h => h.Column1)

modelBuilder.Entity<T>
            .HasIndex(h => h.Column2)

Cependant, à première vue, il n'est pas possible d'enchaîner des index comme celui-ci. Actuellement, ce que je fais est de les définir séparément comme:

modelBuilder.Entity<T>
            .HasIndex(h => h.Column1)
            .HasIndex(h => h.Column2);

Y a-t-il une meilleure façon de faire cela?


0 commentaires

3 Réponses :


5
votes

HasIndex () renvoie un type d'IndexBuilder qui vous permet d'appeler des choses comme .IsUnique () ou .HasName () etc.

Existe-t-il une meilleure façon de procéder?

Cela dépend si vous considérez cela comme meilleur ou non, et si vous voulez VRAIMENT parler couramment.

Pour continuer à ajouter des index en utilisant un style courant, vous devez revenir à EntityTypeBuilder. Si vous le souhaitez vraiment, vous pouvez utiliser une méthode d'extension.

builder.Entity<T>()
    .AddIndex(indexBuilder => indexBuilder.HasIndex(h => h.Column1))
    .AddIndex(indexBuilder => indexBuilder.HasIndex(h => h.Column2).IsUnique());

public static EntityTypeBuilder<TEntity> AddIndex<TEntity>(this EntityTypeBuilder<TEntity> builder, Action<EntityTypeBuilder<TEntity>> action) where TEntity : class
{
    action(builder);
    return builder;
}

Ou

modelBuilder.Entity<T>
            .AddIndex(h => h.Column1)
            .AddIndex(h => h.Column2);

public static EntityTypeBuilder<TEntity> AddIndex<TEntity>(this EntityTypeBuilder<TEntity> builder, Expression<Func<TEntity, object>> indexExpression) where TEntity : class
{
    builder.HasIndex(indexExpression);
    return builder;
}


0 commentaires

2
votes

Dans Entity Framework 6.x , vous pouvez créer des index en utilisant à la fois Data Annotation et Fluent API mais dans EF Core code> selon la documentation EF Core Indexes , jusqu'à présent, vous ne pouvez créer des index qu'avec Fluent API . Donc, ce que vous faites est la manière appropriée de le faire dans EF Core .

De plus, une chose que vous pouvez faire est de séparer votre configuration d'entité de DbContext comme suit:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.ApplyConfiguration(new FooConfiguration()); //<-- add here
}

Ensuite, appliquez la configuration dans la méthode OnModelCreating comme suit:

public class FooConfiguration : IEntityTypeConfiguration<Foo>
{
    public void Configure(EntityTypeBuilder<Foo> builder)
    {
        ...
        builder.HasIndex(h => h.Column1).IsUnique();
        builder.HasIndex(h => h.Column2).IsUnique();
       ..
    }
}


0 commentaires

-1
votes

Vous pouvez créer plusieurs index à l'aide de Fluent Api

 Add multiple columns index:
 modelBuilder.Entity<MyEntity>().HasIndex(p => new {p.Prop1, p.Prop2});


1 commentaires

Votre exemple crée un seul index basé sur plusieurs colonnes, et non sur plusieurs index. C'est un résultat très différent.