实体框架代码优先:表拆分和自定义字段

时间:2015-07-06 22:02:22

标签: entity-framework ef-code-first ef-fluent-api

首先我要说的是,如果可以的话,我会改变这个数据库模型,但它是我们的OTS解决方案之一是如何设计以容纳多个客户并允许自定义配置。

也就是说,我使用EF代码第一种方法,并希望创建多个实体来映射到一个基本上用作自定义字段数据表的表。该表的架构如下:

ID   EmployeeID   Category   Field1   Field2   Field3
1    1            Education  NYU      B.A.     2008
2    1            Retirement 401k     200.00   2054
3    2            Education  GWU      M.A.     2003
4    2            Retirement Roth     140.00   2048

还有另一张表解释了Field1,Field2,Field3的含义(例如大学,学位,教育毕业年,投资,双周贡献,退休资格年)。

当前配置预计不会发生变化(对于我们公司而言),所以我宁愿将这个单独的自定义字段表映射到两个独立的实体:EducationData和RetirementData,它们具有智能命名的属性,如"大学" ," Degree" ...等。而不是" Field1"," Field2" ...等。

有关如何解决这个问题的任何建议?理想情况下,我想将其配置为EF模型的一部分,以便我可以查询新字段,但我可以接受建议。

context.Employees.EducationData(x => x.University == "GWU"); 

而不是

context.Employees.CustomFieldData(x => x.Category == "Education" && x.Field1 == "GWU")

1 个答案:

答案 0 :(得分:1)

我认为您可以尝试这样做的一种方法是使用TPH:

  1. 创建一些类型

    abstract class CustomFieldData
    {
        public int ID { get; set; }
        public int EmployeeID { get; set; }
        public string Field1 { get; set; }
        public string Field2 { get; set; }
        public string Field3 { get; set; }
    }
    
    class EducationData : CustomFieldData
    {
        public string School { 
            get { return Field1; }  // you could use custom conversion here
            set { Field1 = value; }
        // similar for other fields
    }
    
    class RetirementData : CustomFieldData
    {
        // similar to EducationData
    }
    
  2. 自定义mapping for TPH

    modelBuilder.Entity<CustomFieldData>()  
        .Map<EducationData>(m => m.Requires("Category").HasValue("Education"))  
        .Map<RetirementData>(m => m.Requires("Category").HasValue("Retiremen"));
    
  3. 忽略从FieldX映射的派生类中的字段,因为您不能将多个属性映射到同一数据库列。

    modelBuilder.Entity<EducationData>().Ignore(t => t.School);
    // similar for other properties