Aakash
Aakash

Reputation: 155

How to rename Primary key Column in code first approach in ASP.net MVC?

I am using EF code first approach. I need to rename my PK column name.

 public class classname
    {
    [Key]
    public int OldId { get; set; }
    }

I need to change OldId to NewId. I tried renaming my OldId to NewId, I tried updating my database with Migration but that didn't help. I tried renaming both in column name and model and again when I tried to update my database I still get error. How can I rename my primary Key column without losing its data?

Upvotes: 0

Views: 3028

Answers (3)

Harald Coppoolse
Harald Coppoolse

Reputation: 30512

Is the question that OldId is not used in your code anymore but is still in your database, or is your problem that it OldId is in your code but has a different column name in your database?

You can use fluent API or data annotations if you want to tell entity framework that the name of property in your DbSet has a different column name in the database:

Fluent API Method

public class MyDbContext : DbContext
{
    public DbSet<ClassName> ClassNames {get; set;}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         // Tell entity framework that you are now building ClassName:
         var classNameConfig = modelBuilder.Entity<ClassName>();

         // ClassName has an int primary key in OldId:
         classNameConfig.HasKey(className => className.OldId);

         // "columnX" in the database corresponds with property OldId
         classNameConfig.Property(className => className.OldId)
             .HasColumnName("columnX");
    }
}

Of course in this specific example this can be concatenated into one statement.

The nice thing about fluent API is that you disconnect your classes from the actual database representation. This hides how the actual database names its columns, column order, min size, max size etc from the user of the DbSets.

Just specify a different DbContext, and you can use the same classes with a different Db.

For instance, if you want to use the same entity framework classes in different databases:

class BaseContext : DbContext
{
    public DbSet<MyClass> MyClasses {get; set;}
}

// context to be used with database X:
class DataBaseXContext : BaseContext
{
     protected override void OnModelCreating(
DbModelBuilder modelBuilder)
     {
         // I want to use "columnX" for property A, which is optional:
         modelBuilder.Entity<MyClass>
             .Property(p => p.A)
             .HasColumnName("columnX")
             .IsOptional();
     }
}

// context to be used with database Y:
class DataBaseXContext : BaseContext
{
     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
         // I want to use "columnY" for property A, which is required:
         modelBuilder.Entity<MyClass>
             .Property(p => p.A)
             .HasColumnName("columnY")
             .IsRequired();
     }
}

Data Annotations Method

If you are absolutely sure you want your classes to be used in only one database, with one pre-defined model, you could use Data Annotations.

However, your question shows that it is not uncommon that the same classes will be used in a different database model. So, although this method is very commonly used, I urge you to reconsider a decision to use Data Annotations.

public class classname
{
    [Key]
     [Column("ColumnX")]
     public int OldId { get; set; }
}

Upvotes: 1

bubi
bubi

Reputation: 6501

The name of the entity property can be different from the name of the database column.

If you need to change the name of the column on the database you can do it with the DBMS manager (SQL Server Enterprise Manager if you are using SQL Server) or running the proper DDL statement (sp_rename on SQL Server) then set the new column name on the property using the attribute ColumnAttribute

[Column("NewId")]
[Key]
public int OldId { get; set; }

If you need to change the name in the code but not on the database you can do a similar thing

[Column("OldId")]
[Key]
public int NewId { get; set; }

In this case you should do a refactor (rename with F2 if you have standard visual studio Keys or Ctrl+R, R if you are using resharper)

If you need to change both you can do both.

Upvotes: 0

RAHUL S R
RAHUL S R

Reputation: 1579

changing the Identity column may lead to instability and you cant change anything with the column unless you kill all the Key constraints (all table relation ship) t will be tooo complicated i would advice you that if data isnt Important then just delete the database and re run migraions it will recreate the database again

Upvotes: 0

Related Questions