Как создать более одного индекса, используя EF Core Fluent API? - PullRequest
0 голосов
/ 21 февраля 2019

странно, я нигде не мог найти ни одного примера или упоминания об этом.Я хотел бы установить индексы для двух моих столбцов (не составного индекса, а только двух отдельных индексов), используя свободный API.

Например, мне было интересно, возможно ли сделать что-то вроде:

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

Однако, судя по всему, цепочки индексов не возможны.В настоящее время я настраиваю их отдельно:

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

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

Есть ли лучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

В Entity Framework 6.x вы можете создавать индексы, используя Data Annotation и Fluent API, но в EF Core в соответствии с документацией EF Core Indexes , пока вы можете создавать индексы только с Fluent API,Таким образом, то, что вы делаете, является подходящим способом сделать это в EF Core.

. Кроме того, вы можете отделить свою конфигурацию сущности от DbContext следующим образом:

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

Затем примените конфигурацию в методе OnModelCreating следующим образом:

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

    modelBuilder.ApplyConfiguration(new FooConfiguration()); //<-- add here
}
0 голосов
/ 28 мая 2019

Вы можете создать несколько индексов, используя Fluent Api

 Add multiple columns index:
 modelBuilder.Entity<MyEntity>().HasIndex(p => new {p.Prop1, p.Prop2});
0 голосов
/ 21 февраля 2019

HasIndex () возвращает тип IndexBuilder, который позволяет вам вызывать такие вещи, как .IsUnique () или .HasName () и т. Д.

Есть ли лучший способ сделать это?

Зависит от того, считаете ли вы это лучше или нет, и хотите ли вы ДЕЙСТВИТЕЛЬНО быть беглым.

Чтобы продолжать добавлять индексы с использованием беглого стиля, необходимо вернуться к EntityTypeBuilder.Если вы действительно хотите, вы можете использовать метод расширения.

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;
}

Или

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;
}
...