如何使用EF Core Fluent API创建多个索引?

5

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

有更好的方法吗?

2个回答

6

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

3
在Entity Framework 6.x中,您可以使用数据注释和Fluent API创建索引。但是,根据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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接