如何动态更改在 Entity Framework 上下文 class 中创建的模型的列名
How to dynamically change column name on model creating in Entity Framework context class
我有一个这样的基础 class:
public class BaseClass : IEditableObject {
public BaseClass() {
}
public Guid Id { get; set; }
public void BeginEdit() {
}
public void CancelEdit() {
}
public void EndEdit() {
}
}
我有 2 个派生的 classes:
public class User : BaseClass {
[Column( "UserFirstName" )]
public string FirstName {
get;
set;
}
[Column( "UserLastName" )]
public string LastName {
get;
set;
}
}
public class School : BaseClass {
[Column( "SchoolName" )]
public string Name {
get;
set;
}
}
我正在使用 Entity Framework 代码优先并在我的上下文中配置这些 classes class:
public class MyContext : DbContext {
public MyContext() : base() {
Database.SetInitializer( new MigrateDatabaseToLatestVersion<MyContext, Configuration>() );
}
public DbSet<User> Users { get; set; }
public DbSet<School> Schools { get; set; }
protected override void OnModelCreating( DbModelBuilder modelBuilder ) {
base.OnModelCreating( modelBuilder );
}
}
当我 运行 创建程序数据库和 table 时,但每个 table 的主键列名称是 Id。我希望列名是 UserId 或 SchoolId.
因此我必须在创建模型时配置实体以使用 TableNameId
更改列名称
我也能胜任这份工作:
modelBuilder.Entity<User>().Property( i => i.Id ).HasColumnName( "UserId" );
modelBuilder.Entity<School>().Property( i => i.Id ).HasColumnName( "SchoolId" );
假设我有数百个 classes,我将为每个实体一个一个地进行配置,所以这是一个巨大的时间浪费。
我如何使用迭代或其他我不知道的方法动态地完成这项工作?
您可以为此使用 Custom Code First Conventions。你的情况:
modelBuilder.Properties().Where(p => p.Name == "Id")
.Configure(c => c.HasColumnName(c.ClrPropertyInfo.ReflectedType.Name + "Id"));
您可以使用 DbModelBuilder.Types<T>
方法对所有 BaseClass
派生实体应用您的自定义约定:
modelBuilder.Types<BaseClass>().Configure(c =>
c.Property(e => e.Id).HasColumnName(c.ClrType.Name + "Id")
);
我有一个这样的基础 class:
public class BaseClass : IEditableObject {
public BaseClass() {
}
public Guid Id { get; set; }
public void BeginEdit() {
}
public void CancelEdit() {
}
public void EndEdit() {
}
}
我有 2 个派生的 classes:
public class User : BaseClass {
[Column( "UserFirstName" )]
public string FirstName {
get;
set;
}
[Column( "UserLastName" )]
public string LastName {
get;
set;
}
}
public class School : BaseClass {
[Column( "SchoolName" )]
public string Name {
get;
set;
}
}
我正在使用 Entity Framework 代码优先并在我的上下文中配置这些 classes class:
public class MyContext : DbContext {
public MyContext() : base() {
Database.SetInitializer( new MigrateDatabaseToLatestVersion<MyContext, Configuration>() );
}
public DbSet<User> Users { get; set; }
public DbSet<School> Schools { get; set; }
protected override void OnModelCreating( DbModelBuilder modelBuilder ) {
base.OnModelCreating( modelBuilder );
}
}
当我 运行 创建程序数据库和 table 时,但每个 table 的主键列名称是 Id。我希望列名是 UserId 或 SchoolId.
因此我必须在创建模型时配置实体以使用 TableNameId
更改列名称我也能胜任这份工作:
modelBuilder.Entity<User>().Property( i => i.Id ).HasColumnName( "UserId" );
modelBuilder.Entity<School>().Property( i => i.Id ).HasColumnName( "SchoolId" );
假设我有数百个 classes,我将为每个实体一个一个地进行配置,所以这是一个巨大的时间浪费。
我如何使用迭代或其他我不知道的方法动态地完成这项工作?
您可以为此使用 Custom Code First Conventions。你的情况:
modelBuilder.Properties().Where(p => p.Name == "Id")
.Configure(c => c.HasColumnName(c.ClrPropertyInfo.ReflectedType.Name + "Id"));
您可以使用 DbModelBuilder.Types<T>
方法对所有 BaseClass
派生实体应用您的自定义约定:
modelBuilder.Types<BaseClass>().Configure(c =>
c.Property(e => e.Id).HasColumnName(c.ClrType.Name + "Id")
);