繁体   English   中英

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

[英]Create custom property mapping for all properties in EF6

模型:

实体类,因为ID在所有实体之间共享

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

还有Student类,它继承了Entity类

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()方法不再存在。

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

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

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")]属性就可以了,但是随着数据库的增长以及添加的实体类越来越多,它可能会很重复并且可以易碎,因为它是手动命名的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM