如何在代码中重命名主键列在ASP.net MVC中的第一种方法?

时间:2017-07-11 04:02:32

标签: asp.net-mvc entity-framework

我正在使用EF代码第一种方法。我需要重命名我的PK列名。

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

我需要将OldId更改为NewId。我尝试将我的OldId重命名为NewId,我尝试使用Migration更新我的数据库,但这并没有帮助。 我尝试在列名和模型中重命名,当我尝试更新数据库时,我仍然得到错误。 如何在不丢失数据的情况下重命名主键列?

3 个答案:

答案 0 :(得分:1)

问题是OldId在代码中不再使用但仍在您的数据库中,或者您的问题是OldId在您的代码中但在您的数据库中有不同的列名?

如果您想告诉实体框架DbSet中的属性名称在数据库中有不同的列名,您可以使用流畅的API或数据注释:

Fluent API方法

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

当然,在这个具体的例子中,这可以连接成一个语句。

关于流畅API的好处是你可以将类与实际的数据库表示断开连接。这隐藏了实际数据库如何从DbSets的用户命名其列,列顺序,最小大小,最大大小等。

只需指定一个不同的DbContext,就可以使用具有不同Db的相同类。

例如,如果要在不同的数据库中使用相同的实体框架类:

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

数据注释方法

如果您完全确定希望您的类仅在一个数据库中使用,并且使用一个预定义的模型,则可以使用数据注释。

但是,您的问题表明,在不同的数据库模型中使用相同的类并不罕见。因此,虽然这种方法非常常用,但我建议您重新考虑使用数据注释的决定。

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

答案 1 :(得分:0)

更改Identity列可能会导致不稳定,除非您终止所有Key约束(所有表关系),否则您无法更改列的任何内容 t会太复杂我会建议你,如果数据不重要,那么只需删除数据库并重新运行迁移,它将重新创建数据库

答案 2 :(得分:0)

实体属性的名称可以与数据库列的名称不同。

如果需要更改数据库中列的名称,可以使用DBMS管理器(SQL Server企业管理器,如果您使用的是SQL Server)或在SQL上运行正确的DDL语句(sp_rename然后,服务器)使用属性ColumnAttribute

在属性上设置新列名
[Column("NewId")]
[Key]
public int OldId { get; set; }

如果您需要更改代码中的名称而不是数据库中的名称,则可以执行类似的操作

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

在这种情况下,你应该做一个重构(如果你有标准的visual studio键或者Ctrl + R,则使用F2重命名,如果使用resharper则重命名为R)

如果您需要更改两者,则可以同时执行这两项操作。