奇怪的是,我在任何地方都找不到任何示例或提及此内容。我想使用流利的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 :(得分: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 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
}
答案 2 :(得分:0)
您可以使用Fluent Api创建多个索引
Add multiple columns index:
modelBuilder.Entity<MyEntity>().HasIndex(p => new {p.Prop1, p.Prop2});