为 EF6 中的所有属性创建自定义 属性 映射
Create custom property mapping for all properties in EF6
型号:
实体 class 因为 ID 在所有实体之间共享
public abstract class Entity
{
public int Id { get; set; }
}
和继承实体 class
的学生 class
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; }
}
Table 列的命名约定为 STUDENT_ID、LAST_NAME、FORENAMES 等。
所有表都将具有 [NAME]_ID
的 ID 列
如何为所有实体 classes 中的所有属性创建自定义映射?引用的代码 here 不起作用,因为 .Entities()
方法不再存在。
您可以使用列属性来进行自定义列名映射:
public class Student
{
[Column("STUDENT_ID")]
public int Id { get; set; }
//...
}
覆盖上下文 class 上的 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");
}
我无法将两个答案都标记为正确(它们都是正确的),但我试图达到的想法是设置所有列名自动从 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")]
属性会很好,但是随着数据库的增长,实体越来越多 类 添加它可能会非常重复并且可能很脆弱,因为它是手动命名的。
型号:
实体 class 因为 ID 在所有实体之间共享
public abstract class Entity
{
public int Id { get; set; }
}
和继承实体 class
的学生 classpublic 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; }
}
Table 列的命名约定为 STUDENT_ID、LAST_NAME、FORENAMES 等。 所有表都将具有 [NAME]_ID
的 ID 列如何为所有实体 classes 中的所有属性创建自定义映射?引用的代码 here 不起作用,因为 .Entities()
方法不再存在。
您可以使用列属性来进行自定义列名映射:
public class Student
{
[Column("STUDENT_ID")]
public int Id { get; set; }
//...
}
覆盖上下文 class 上的 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");
}
我无法将两个答案都标记为正确(它们都是正确的),但我试图达到的想法是设置所有列名自动从 ColumnName 映射到 COLUMN_NAME,而无需指定为每个 属性.
手动列名我从
所以:
// 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")]
属性会很好,但是随着数据库的增长,实体越来越多 类 添加它可能会非常重复并且可能很脆弱,因为它是手动命名的。