【问题标题】:EF Core Entity with Primary Key but without Clustered Index具有主键但没有聚集索引的 EF Core 实体
【发布时间】:2022-01-13 21:52:13
【问题描述】:

对于实体框架,当我们在实体上有一个主键时,EF 总是会生成一个聚集索引。

public class TestEntity
{
    [key]
    public int NaturalKeyId;

    public string Field2;
    public string Field3;
}

NaturalKeyId 字段将形成一个聚集索引。

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

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

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

【问题讨论】:

    标签: entity-framework entity-framework-core


    【解决方案1】:

    对于 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

    【讨论】:

    • 谢谢!它可以工作,但会建立对 SQL Server 提供程序的依赖。
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2021-12-14
    • 2010-12-07
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多