问题是您的代码中不再使用 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");
}
}
当然,在这个具体的例子中,这可以连接成一个语句。
Fluent API 的好处在于,您可以将类与实际的数据库表示断开连接。这向 DbSet 的用户隐藏了实际数据库如何命名其列、列顺序、最小大小、最大大小等。
只需指定不同的 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; }
}