具有主键但没有聚簇索引的 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
对于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