如何动态更改在 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。我希望列名是 UserIdSchoolId.

因此我必须在创建模型时配置实体以使用 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")
);