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.

5
  • Possible duplicate of In Entity Framework 6.1, how can I use the IndexAttribute to define a clustered index? Commented Apr 18, 2016 at 19:20
  • @Korayem who says I use EF 6.1? Commented Apr 19, 2016 at 7:56
  • you tagged the question entity-framework-6 so I presumed 6.1. I edited the title and removed the duplicate request. Commented Apr 19, 2016 at 8:35
  • 1
    Very much appreciated. Commented Apr 19, 2016 at 8:39
  • For the benefit of searchers, I created a related post for EntityFramework Core, which also enables this - stackoverflow.com/questions/41004292/… Commented Dec 7, 2016 at 9:44

2 Answers 2

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);
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks. I have found something along those lines. I presume this is still the case then. I wait a bit longer before I accept.
0

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

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.