使用关系中的属性对 child class 进行建模的正确方法

Proper way to model a child class with properties from its relationship

我有一个 Lawsuit class,其中有一个 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

我还可以创建一个 in-between class EmployerLawsuit 和一个名为 Mainbool 属性:

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; }
}

考虑到生成的数据库的性能(我使用的是 Entity Framework)和 SOLID 的原理,这两种方法中的哪一种更好?或者有没有更好的方法来模拟这些实体?

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

在面向对象编程方面 #1 听起来更好,并且当使用 O/RM.

关于#2

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

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