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

时间:2015-11-28 11:44:00

标签: c# entity-framework mapping

型号:

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

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

继承Entity类的Student类

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等。 所有表都将具有[NAME] _ID

的ID列

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

3 个答案:

答案 0 :(得分:2)

覆盖上下文类中的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");
}

答案 1 :(得分:1)

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

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

  //...
}

答案 2 :(得分:1)

我无法将这两个答案都标记为正确(它们是),但我想要的想法是将所有列名自动映射到ColumnName到COLUMN_NAME,而不必为每个属性手动指定列名

我找到了来自Loop over entity column mappings to transform 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")]属性就没问题了,但是随着数据库的增长,添加的实体类越来越多,它可能会非常重复,并且可以因为它是手动命名的,所以很脆弱。