编程语言
首页 > 编程语言> > c# – 如何在Entity Framework上下文类中创建模型时动态更改列名

c# – 如何在Entity Framework上下文类中创建模型时动态更改列名

作者:互联网

我有这样一个基类:

public class BaseClass : IEditableObject {

    public BaseClass() {

    }

    public Guid Id { get; set; }

    public void BeginEdit() {

    }
    public void CancelEdit() {

    }
    public void EndEdit() {

    }
}

我有2个派生类:

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 Code-First并在我的上下文类中配置这些类:

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

}

当我运行程序数据库并创建表但主键列名称是每个表的Id.我希望列名称为UserId或SchoolId.

因此,我必须在模型创建时配置实体以使用TableNameId更改列名

我也可以做这个工作:

modelBuilder.Entity<User>().Property( i => i.Id ).HasColumnName( "UserId" );
modelBuilder.Entity<School>().Property( i => i.Id ).HasColumnName( "SchoolId" );

假设我有数百个类,我将为每个实体逐个进行配置,这样就浪费了很多时间.

如何使用迭代或其他我不知道的东西动态地完成这项工作?

解决方法:

您可以使用DbModelBuilder.Types<T>方法在所有BaseClass派生实体上应用自定义约定:

modelBuilder.Types<BaseClass>().Configure(c => 
    c.Property(e => e.Id).HasColumnName(c.ClrType.Name + "Id")
);

标签:c,entity-framework,dbcontext,ef-fluent-api
来源: https://codeday.me/bug/20190611/1217564.html