我有一个 Lawsuit
类,它有一个 Employer
列表。要求必须将列表中的雇主之一设置为主要雇主。我想到了两种方法来满足这个业务规则。
解决方案一
这是我当前的实现,我有一个 MainEmployer
并且我在此属性和 Employers
列表中存储相同的实体:
public class Lawsuit()
{
public int Id { get; set; }
public virtual Employer MainEmployer { get; set; }
public virtual ICollection<Employer> Employers { get; set; }
}
方案二
我还可以创建一个中间类 EmployerLawsuit
,它带有一个名为 Main
的 bool 属性:
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 方法。它只是 Lawsuit
和 Employer
之间的一对多/多对一关联。也就是说,当检索 Lawsuit
持久对象时,将作为 SQL 连接 的一部分检索所谓的关联,此外,您不需要查询所有雇主检查哪个是主要雇主。
就面向对象编程而言,#1 听起来更好,并且当使用 O/RM 映射到关系数据库或 NoSQL 数据库时,域的性能会更好。
关于#2
实际上,#2 听起来更像是以关系方式设计域。这将是一个设计为可查询的域,而面向对象编程产生层次模型,这是用关联而不是使用标志或标识符来表达域的主要原因定义域实体的关系。
您不需要标志来将实体标记为主要雇主并为此实现层次结构。保持简单:设置整个 MainEmployer
关联并开始!
关于c# - 使用其关系中的属性为子类建模的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33637505/