Indexing 非集群主键实体框架代码优先

Indexing 非集群主键实体框架代码优先,indexing,entity-framework-6,Indexing,Entity Framework 6,在实体框架代码优先的方法中,我们可以将主键定义为非聚集索引,将其他几个字段的组合定义为聚集索引 感谢EntityTypeConfiguration没有提供将主键设置为非聚集索引的方法,但您可以通过更改用于表创建的初始迁移来完成此操作。有一个例子 以下是如何使用属性指定聚集多列索引的示例: [Index("IX_ColumnOneTwo", 1, IsClustered = true)] public int ColumnOne { get; set;} [Index("IX_ColumnOne

在实体框架代码优先的方法中,我们可以将主键定义为非聚集索引,将其他几个字段的组合定义为聚集索引


感谢

EntityTypeConfiguration没有提供将主键设置为非聚集索引的方法,但您可以通过更改用于表创建的初始迁移来完成此操作。有一个例子

以下是如何使用属性指定聚集多列索引的示例:

[Index("IX_ColumnOneTwo", 1, IsClustered = true)]
public int ColumnOne { get; set;}

[Index("IX_ColumnOneTwo", 2, IsClustered = true)]
public int ColumnTwo { get; set; }
以及如何使用model builder完成此操作的示例:

modelBuilder.Entity<ClassOne>() 
            .Property(t => t.ColumnOne) 
            .HasColumnAnnotation( 
                     "Index",  
                     new IndexAnnotation(new IndexAttribute("IX_ColumnOneTwo") { IsClustered = true }));
modelBuilder.Entity<ClassOne>() 
            .Property(t => t.ColumnTwo) 
            .HasColumnAnnotation( 
                     "Index",  
                     new IndexAnnotation(new IndexAttribute("IX_ColumnOneTwo") { IsClustered = true }));
modelBuilder.Entity()
.Property(t=>t.ColumnOne)
.HasColumnAnnotation(
“索引”,
新指数说明(新指数属性(“IX_ColumneTo”){IsClustered=true});
modelBuilder.Entity()
.Property(t=>t.ColumnTwo)
.HasColumnAnnotation(
“索引”,
新指数说明(新指数属性(“IX_ColumneTo”){IsClustered=true});

有一种解决方案,首先通过在DbContext中重写OnModelCreating来解决实体框架核心代码

  p.HasKey(b => b.ColumnId).ForSqlServerIsClustered(false);
此代码将生成如下迁移:

 table.PrimaryKey("PK_Columns", x => x.ColumnId)
                        .Annotation("SqlServer:Clustered", false);

EF 6.2解决了这个问题。目前,它处于测试状态,但它可以工作

首先,将EF升级到6.2:

Install-Package EntityFramework -Version 6.2.0-beta1 -Pre
然后,在
OnModelCreating
方法中,将主键的IsClustered设置为
false

modelBuilder.Entity<Receipt>().HasKey(r => r.RecId, config => config.IsClustered(false) );
modelBuilder.Entity().HasKey(r=>r.RecId,config=>config.IsClustered(false));

Radenko Zec
在EF Core中也非常有用。我将在此基础上提供一个控制命名的完整解决方案,如果需要,还将包括一个标识。我将从我的一个项目中选择一个例子:

NLog
  • 仔细检查是否生成了标识码(之后添加标识要困难得多):

    migrationBuilder.CreateTable(
    名称:“NLog”,
    列:表=>new
    {
    NLogId=table.Column(可空:false)
    .Annotation(“SqlServer:ValueGenerationStrategy”,SqlServerValueGenerationStrategy.IdentityColumn),
    

  • 版本6.2.0现在是最终版本,不再是beta版。这个答案非常有效。我从6.1.3升级到6.2.0就是为了做到这一点,没有任何问题。+1
    NLogId - Primary Key, non-clustered, identity
    EnteredDate - Clustered index
    <other columns>
    
    entity
        .HasKey(p => p.NlogId)
        .ForSqlServerIsClustered(false).HasName("PK_NLog");
    
    entity
        .HasIndex(p => p.EnteredDate)
        .ForSqlServerIsClustered(true).HasName("IDX_NLog_EnteredDate");
    
    migrationBuilder.CreateTable(
        name: "NLog",
        columns: table => new
        {
            NLogId = table.Column<int>(nullable: false)
                .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),