首页 > 解决方案 > 如何使用 EF Core fluent api 创建多个索引?

问题描述

奇怪的是,我在任何地方都找不到任何例子或提及这一点。我想使用流利的 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)

有一个更好的方法吗?

标签: c#ef-core-2.1

解决方案


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

推荐阅读