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

时间:2019-02-21 03:09:59

标签: c# ef-core-2.1

奇怪的是,我在任何地方都找不到任何示例或提及此内容。我想使用流利的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 :(得分:2)

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

答案 1 :(得分:1)

Entity Framework 6.x中,您可以同时使用Data AnnotationFluent 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
}

答案 2 :(得分:0)

您可以使用Fluent Api创建多个索引

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