Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework Change Primary Key Type

I'm using EF 6.0 Code First, and I have this entity:

 public class TrainingRespect
 {
    [Key]
    public int RespectId { get; set; }

    public DateTime? DateWhenRespected { get; set; }

    #region

    public string UserId { get; set; }
    public User User { get; set; }

    public Guid TrainingId { get; set; }
    public Trening Training { get; set; }

    #endregion
 }

And I would like to change it's Primary Key (RespectId) from int to GUID / string / long.

What is easiest way of doing this ? Can I just change type and EF migrations will take care of everything or it should be done some other way ?

like image 280
hyperN Avatar asked Jan 23 '15 10:01

hyperN


1 Answers

Ok to actually answer your question. Yes you can just change the data type and Migrations should take care of it.

However based off your comments you're having trouble applying this migration. This doesn't negate the above but I'll attempt to help using a bit of guesswork.

If you're using Sql Azure, you must have clustered indexes on all tables. EF6 should create clustered indexes even on string keys. There is a bug with alpha 3 though where it doesn't create a clustered key on the migrations table.

http://entityframework.codeplex.com/discussions/435723

See the above link for a description and a workaround.

If you're still having trouble, you can run the following command from the package console:

Update-Database -Script

This will produce a SQL Script instead of trying to update directly. You can look at this and see if any of the Create Table statements do not have a clustered index on them.

If, for some reason there aren't. You can explicitly modify your migration's CreateTable statement to make the primary key clustered.

CreateTable("MyTable", 
    c => new { 
        Id = c.String(nullable: false, maxLength: 128)
    })
.PrimaryKey(t => t.Id, null, true);

Also worth noting: Guids make terrible clustered indexes. If you're using GUID keys and have the option, don't cluster on them and have a second clustered index instead.

like image 152
JamesT Avatar answered Oct 18 '22 02:10

JamesT