使用继承实体创建代码优先数据库的最佳策略是什么?

时间:2014-07-08 05:06:27

标签: c# entity-framework inheritance ef-code-first

例如,如果我有一个模型:

public class BasePolicy {
    public int Id { get; set; }
    public string Name { get; set; }   
}

public class PaymentPolicy : BasePolicy {
    public string PaymentMethod  { get; set; }
}

public class ReturnPolicy : BasePolicy {
    public int ReturnTerm  { get; set; }
}

...并且想要创建具有下一个要求的codefirst数据库和存储库:

  • 在基本类型(Id)中按BasePolicy检索基本实体的能力。这对于管理索引页面是必要的,该页面仅按其名称显示策略列表。
  • 我需要使用PaymentMethod选择来访问儿童特定属性(PaymentPolicy,如果它是Id - 等)。这是编辑操作所必需的。

最好的方法是什么?我应该为每种子类型创建单独的表吗?

public class Database : DbContext
{
     public DbSet<PaymentPolicy> PaymentPolicies { get; set; }
     public DbSet<ReturnPolicy> ReturnPolicies { get; set; }
}

+ 数据按逻辑排序
- 如果没有加入这些表并在select查询中指定策略类型,我将无法通过它的唯一ID获取BasePolicy个实体。这就是为什么我应该向基类型注入一些PolicyType枚举并实现存储库方法,它将获得BasePolicy类型(以确定从哪个表中获取)并且只有这样通过唯一Id - 和向下转发BasePolicy到特定子类型政策。这是我刚刚使用的解决方案。

...我应该彻底删除继承吗?

public class PaymentPolicy {
     public int Id { get; set; }
     public string Name { get; set; } 
     public string PaymentMethod  { get; set; }
}

public class ReturnPolicy {
    public int Id { get; set; }
    public string Name { get; set; } 
    public int ReturnTerm  { get; set; }
}

+ 数据仍按逻辑排序 - 我仍然无法通过它的唯一身份获取BasePolicy实体。

...我应该将子类型作为导航属性添加到基本类型吗?

public class BasePolicy {
    public int Id { get; set; }
    public string Name { get; set; }   
    public PaymentPolicy PaymentPolicy { get; set; }
    public ReturnPolicy ReturnPolicy { get; set; }
}

public class PaymentPolicy {
    public string PaymentMethod  { get; set; }
}

public class ReturnPolicy {
    public int ReturnTerm  { get; set; }
}

- 这将破坏逻辑模型结构
+ 我将能够获得没有冗余连接的策略列表 + 它将提供强大的一对一关系

还是有一些更高级的策略和技巧

0 个答案:

没有答案