代码之家  ›  专栏  ›  技术社区  ›  kovac

如何使用EF Core fluent api创建多个索引?

  •  0
  • kovac  · 技术社区  · 6 年前

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

    有更好的办法吗?

    0 回复  |  直到 6 年前
        1
  •  2
  •   Jerry    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;
    }
    
        2
  •  2
  •   TanvirArjel    6 年前

    Entity Framework 6.x 可以使用以下两种方法创建索引 Data Annotation Fluent API 但是在 EF Core 根据 EF Core Indexes 文档,到目前为止,您只能使用 流畅的API . 所以你现在做的是 EF核心 .

    另外,您可以做的一件事是将实体配置与 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
    }
    
        3
  •  0
  •   Ahmet Arslan    6 年前

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

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