create non clustered index on primary key entity framework 6.0
Asked Answered
C

2

4

I am aware of this, which states that it is not possible to create a primary key with non clustered index via code first. Is this still the case?

Ideally, I would like to specify via EntityTypeConfiguration, that my primary key (Guid) has a non-clustered index and there is another column (int) with a clustered index.

Carboxylase answered 17/7, 2015 at 12:9 Comment(5)
Possible duplicate of In Entity Framework 6.1, how can I use the IndexAttribute to define a clustered index?Private
@Private who says I use EF 6.1?Carboxylase
you tagged the question entity-framework-6 so I presumed 6.1. I edited the title and removed the duplicate request.Private
Very much appreciated.Carboxylase
For the benefit of searchers, I created a related post for EntityFramework Core, which also enables this - #41004792Turkic
C
5

AFAIK this is not possible with EntityTypeConfiguration. However you can do this with Code-First migrations. Working example:

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");
    }
}

Result:

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);
Center answered 17/7, 2015 at 17:40 Comment(1)
Thanks. I have found something along those lines. I presume this is still the case then. I wait a bit longer before I accept.Carboxylase
A
0

You can also do this with your OnModelCreating method like so:

modelBuilder.Entity(entityTypeName)
    .HasKey(nameof(ClassName.Id))
    .ForSqlServerIsClustered(false);
Austria answered 14/11, 2019 at 0:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.