在主键实体框架6.0上创建非聚集索引

时间:2015-07-17 12:09:48

标签: entity-framework entity-framework-6

我知道this,它指出不可能首先通过代码创建具有非聚集索引的主键。这仍然是这样吗?

理想情况下,我想通过EntityTypeConfiguration指定我的主键(Guid)有一个非聚集索引,还有另一个列(int)带有聚簇索引。

2 个答案:

答案 0 :(得分:5)

AFAIK使用EntityTypeConfiguration无法做到这一点。但是,您可以使用Code-First迁移执行此操作。工作示例:

public class Product
{
    public Guid Id
    { get; set; }

    public int Price
    { get; set; }
}

class AppDbContext : DbContext
{
    public DbSet<Product> Products
    { get; set; }
}

public partial class InitialCreate : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.Products",
            c => new
                {
                    Id = c.Guid(nullable: false),
                    Price = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.Id, clustered: false)
            .Index(t => t.Price, clustered: true);

    }

    public override void Down()
    {
        DropIndex("dbo.Products", new[] { "Price" });
        DropTable("dbo.Products");
    }
}

结果:

CREATE TABLE [dbo].[Products] (
    [Id]    UNIQUEIDENTIFIER NOT NULL,
    [Price] INT              NOT NULL,
    CONSTRAINT [PK_dbo.Products] PRIMARY KEY NONCLUSTERED ([Id] ASC)
);

GO
CREATE CLUSTERED INDEX [IX_Price]
    ON [dbo].[Products]([Price] ASC);

答案 1 :(得分:0)

您还可以使用OnModelCreating方法执行此操作,如下所示:

modelBuilder.Entity(entityTypeName)
    .HasKey(nameof(ClassName.Id))
    .ForSqlServerIsClustered(false);