我正在使用EF代码第一种方法。我需要重命名我的PK列名。
public class classname
{
[Key]
public int OldId { get; set; }
}
我需要将OldId更改为NewId。我尝试将我的OldId重命名为NewId,我尝试使用Migration更新我的数据库,但这并没有帮助。 我尝试在列名和模型中重命名,当我尝试更新数据库时,我仍然得到错误。 如何在不丢失数据的情况下重命名主键列?
答案 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)
如果您需要更改两者,则可以同时执行这两项操作。