é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?
3 Réponses :
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; }
Dans De plus, une chose que vous pouvez faire est de séparer votre configuration d'entité de Ensuite, appliquez la configuration dans la méthode 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
. DbContext
comme suit: protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfiguration(new FooConfiguration()); //<-- add here
}
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();
..
}
}
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});
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.