使用关系中的属性为子类建模的正确方法

时间:2015-11-10 18:59:58

标签: c# entity-framework oop solid-principles

我有一个Lawsuit类,其中包含Employer列表。要求列表中的一个雇主必须被设定为主要雇主。我想到了两种方法来满足这个业务规则。

解决方案1 ​​

这是我当前的实现,我有一个MainEmployer,我将同一个实体存储在此属性和Employers列表中:

public class Lawsuit()
{
    public int Id { get; set; }

    public virtual Employer MainEmployer { get; set; }
    public virtual ICollection<Employer> Employers { get; set; }
}

解决方案2

我还可以使用名为EmployerLawsuit bool 属性创建一个中间类Main

public class LawsuitEmployer()
{
    public int Id { get; set; }
    public bool Main { get; set; }

    public virtual Employer Employer { get; set; }
    public virtual Lawsuit Lawsuit { get; set; }
}

public class Lawsuit()
{
    public int Id { get; set; }

    public virtual ICollection<EmployerLawsuit> Employers { get; set; }
}

考虑到生成的数据库(我正在使用实体框架)的性能和SOLID的原则,这两种方法中的哪一种更好?或者有更好的方法来模拟这些实体吗?

1 个答案:

答案 0 :(得分:7)

我坚持使用#1方法。它只是LawsuitEmployer之间的一对多/多对一关联。也就是说,当检索Lawsuit持久对象时,所谓的关联将作为 SQL join 的一部分被检索,此外,您不需要查询所有雇主来检查哪一个是主要雇主

在面向对象编程方面,#1 听起来更好,当使用O / RM映射到关系数据库或NoSQL数据库时,域的性能会更好。

关于#2

实际上#2听起来更像是以关系方式设计域名。它将是一个设计为可查询的域,而面向对象的编程生成层次模型,这是用关联而不是使用标志或标识符来表达域的主要原因定义域实体的关系。

您不需要标记来将实体标记为主要雇主并为此实现层次结构。保持简单:设置整个MainEmployer关联并开始!