为EF6中的所有特性创建自定义特性映射

本文关键字:创建 自定义 映射 EF6 | 更新日期: 2023-09-27 18:25:01

型号:

作为Id的实体类在所有实体之间共享

public abstract class Entity
{
    public int Id { get; set; }
}

以及学生类,它继承了实体类

public class Student : Entity
{
    public string LastName { get; set; }
    public string Forenames { get; set; }
    public DateTime EnrolmentDate { get; set; }
    public virtual ICollection<Enrolment> Enrolments { get; set; }
}

表列具有命名约定STUDENT_ID、LAST_NAME、FORENAMES等。所有表格的ID列均为[NAME]_ID

如何为所有实体类中的所有属性创建自定义映射?此处引用的代码不起作用,因为.Entities()方法已不存在。

为EF6中的所有特性创建自定义特性映射

覆盖上下文类上的OnModelCreating方法,然后可以为每个实体的ID列设置一个自定义名称,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>().Property(x => x.Id).HasColumnName("STUDENT_ID");
    modelBuilder.Entity<Teacher>().Property(x => x.Id).HasColumnName("TEACHER_ID");
}

您可以使用列属性来进行自定义列名映射:

public class Student
{
  [Column("STUDENT_ID")]
  public int Id { get; set; }
  //...
}

我无法将两个答案都标记为正确(事实确实如此),但我试图实现的想法是设置所有列名自动从ColumnName映射到column_NAME,而不必为每个属性手动指定列名。

我从循环实体列映射到转换列名中找到了答案,这适用于除ID列之外的每一列,所以我只使用Yacoub-Massad建议的代码手动设置这些列。

因此:

// Make all properties UPPER_CASE
modelBuilder.Properties()
            .Configure(x => x.HasColumnName(Regex.Replace(x.ClrPropertyInfo.Name, "(?<=.)(?=[A-Z])", "_").ToUpper()));
// Set the ID columns to ENTITY_ID
modelBuilder.Entity<Course>()
    .ToTable("COURSE")
    .Property(x => x.Id)
    .HasColumnName("STUDENT_ID");

如果我没有那么多表和列,那么为每个属性设置[Column("ENTITY_ID")]属性是可以的,但随着数据库的增长和添加的实体类越来越多,它可能会非常重复,并且可能很脆弱,因为它是手动命名的。