如何在EntityTypeConfiguration中创建ASC和DESC组合索引
EF Core 配置带排序方向的组合索引(数据库优先场景)
你要创建的SQL Server组合索引语句为:
CREATE INDEX IX_PetServiceId_Rate ON PetCenterService (PetServiceId ASC, Rate DESC)
之前尝试的EF配置代码存在语法错误——不能在匿名类型的成员初始化中直接添加ASC/DESC排序关键字。以下是正确的配置方式:
正确配置代码(EF Core 5+)
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; public class PetCenterServiceConfiguration : IEntityTypeConfiguration<PetCenterService> { public void Configure(EntityTypeBuilder<PetCenterService> builder) { // 创建组合索引并指定名称、非唯一 var indexBuilder = builder.HasIndex(x => new { x.PetServiceId, x.Rate }) .HasDatabaseName("IX_PetServiceId_Rate") .IsUnique(false); // 分别指定列的排序方向 indexBuilder.HasSortOrder(nameof(PetCenterService.PetServiceId), SortOrder.Ascending); indexBuilder.HasSortOrder(nameof(PetCenterService.Rate), SortOrder.Descending); } }
EF Core 6+ 简化写法
如果使用EF Core 6及以上版本,可使用更简洁的链式语法:
builder.HasIndex(x => new { x.PetServiceId, x.Rate }) .HasDatabaseName("IX_PetServiceId_Rate") .IsUnique(false) .HasSortOrder(sort => sort .Ascending(x => x.PetServiceId) .Descending(x => x.Rate));
说明
- 先通过
HasIndex指定组合索引包含的列,再通过HasSortOrder方法为每个列单独设置排序方向 IsUnique(false)可以省略,因为索引默认就是非唯一的,显式声明只是为了和你的SQL语句保持一致
内容的提问来源于stack exchange,提问作者Panda
相关产品推荐
相关产品推荐

