【问题标题】:Create custom property mapping for all properties in EF6为 EF6 中的所有属性创建自定义属性映射
【发布时间】:2015-11-29 00:19:05
【问题描述】:

型号:

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

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

【问题讨论】:

    标签: c# entity-framework mapping


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我会试试这个。但是,我的所有实体类最终都将继承自自定义类 Entity,因为 ID 列将在所有实体之间共享。有没有办法将列设置为 [Entity]_ID?
      【解决方案3】:

      我无法将两个答案都标记为正确(它们是正确的),但我试图达到的想法是设置所有列名自动从 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")] 属性会很好,但是随着数据库的增长以及添加的实体类越来越多,它可能会非常重复并且可能很脆弱因为它是手动命名的。

      【讨论】:

        猜你喜欢
        • 2018-12-28
        • 1970-01-01
        • 2015-06-09
        • 1970-01-01
        • 2017-05-31
        • 1970-01-01
        • 2015-10-27
        • 1970-01-01
        相关资源
        最近更新 更多