使用带有 GUID 主键的 Entity Framework Core 5.0.4 创建非聚集索引

问题描述

我有这个实体类

public class StatusCode
{
    public const String ClassName       = nameof(StatusCode);
    [Key]
    public Guid         UniqueID        { get; set; } // Primary Key
    public Char         Level           { get; set; } // R=Root,C=Code Group,I=Item
    public Guid         CodeGroup       { get; set; } // F Key - Which group of codes this code belongs to (self reference to this table)
    public String       Code            { get; set; } // Public short form code,normal public use in tabular reports
    public String       FullName        { get; set; } // Full public name,normal public stand alone display
    public String       Description     { get; set; } // Description displayed to explain this code to the public,typically a full sentance
    public String       PublicRemarks   { get; set; } // Longer public remark about this code,typically a few paragraphs
    public String       PrivateRemarks  { get; set; } // Internal use only remark,for display to administrators about the usage of this code
    public Boolean      AvailableYesNo  { get; set; } // Flag to show if this code is available for usage on new records
    public DateTime     AvailableFrom   { get; set; } // Date time that this code is available for first use
    public DateTime     Availableto     { get; set; } // Date time that this code is no longer available for use
}

通过这次迁移:

protected override void Up(MigrationBuilder migrationBuilder)
{
      String lLogHdr = $"{ClassName}.{HCG_Misc.CallingMethodName()} ";
      Console.WriteLine( $"{lLogHdr} - Start" );
      migrationBuilder.CreateTable(
          name: "StatusCode",columns: table => new
          {
            UniqueID       = table.Column<Guid    >( type: "uniqueidentifier",nullable: false ),Level          = table.Column<string  >( type: "nvarchar(1)",CodeGroup      = table.Column<Guid    >( type: "uniqueidentifier",Code           = table.Column<string  >( type: "nvarchar(450)",nullable: true  ),FullName       = table.Column<string  >( type: "nvarchar(max)",Description    = table.Column<string  >( type: "nvarchar(max)",PublicRemarks  = table.Column<string  >( type: "nvarchar(max)",PrivateRemarks = table.Column<string  >( type: "nvarchar(max)",AvailableYesNo = table.Column<bool    >( type: "bit",AvailableFrom  = table.Column<DateTime>( type: "datetime2",Availableto    = table.Column<DateTime>( type: "datetime2",nullable: false )
          },constraints: table => { table.PrimaryKey("PK_StatusCode_UniqueID",x => x.UniqueID);
          });

      migrationBuilder.CreateIndex( name: "Index_StatusCode_Code",table: "StatusCode",column: "Code"      );
      migrationBuilder.CreateIndex( name: "Index_StatusCode_CodeGroup",column: "CodeGroup" );
      Console.WriteLine( $"{lLogHdr} - Complete" );
}

当我跑步时

PM> Update-Database

我得到了一个带有聚集主键索引的数据库表,这对于 GUID 索引来说太疯狂了。我需要做什么才能获得非聚集索引?

解决方法

EF Core 中的原则是每个数据库提供者添加其特定的配置扩展方法。你没有说你的目标数据库是什么,所以假设它是SqlServer,你需要的配置方法叫做IsClustered并扩展关键配置(print(mediaItem))。

所以你需要添加以下内容

HasKey

并重新生成迁移。现在它应该包含这样的内容

modelBuilder.Entity<StatusCode>()
    .HasKey(e => e.UniqueID)
    .IsClustered(false);

并且在应用它时会创建非集群 PK。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...