具有主键但没有聚簇索引的 EF 核心实体

EF Core Entity with Primary Key but without Clustered Index

对于Entity Framework,当我们在实体上有主键时,EF 总是生成聚簇索引。

public class TestEntity
{
    [key]
    public int NaturalKeyId;

    public string Field2;
    public string Field3;
}

NaturalKeyId字段将形成聚簇索引。

有没有办法将其保留为(唯一)主键,但不将其作为聚簇索引?在我被骗之前,我同意在单调递增(代理)Id 字段上使用聚簇索引通常更好。但是在特定情况下,所有更新操作始终使用 NaturalKey(没有为更新传入方便的 Id。更新总是由只知道 Natural Key 的外部系统触发)并且我想避免(如果可能的话)在能够更新/删除之前必须先通过自然键读取实体的开销。

我无法将自然键本身转换为聚簇索引,因为键值本质上是随机的,我将面临插入页面拆分。

编辑: 我已经有了一个可行的解决方案,在 运行 迁移之后,我在数据库中手动重新创建了 table,并在NaturalKeyId 而不是聚簇索引。

对于Microsoft SQL Server,可以使用fluent API配置主键为非集群:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    
    modelBuilder.Entity<TestEntity>().HasKey(e => e.NaturalKeyId).IsClustered(false);
}

Microsoft SQL Server Database Provider - Indexes - EF Core | Microsoft Docs