C# 如何建模多个多对多对象之间的关系

C# 如何建模多个多对多对象之间的关系,c#,many-to-many,domain-driven-design,relationship,C#,Many To Many,Domain Driven Design,Relationship,我正在开发一个旧的c应用程序,它使用iBatis作为ORM。我在建模两个新实体时遇到了一些问题,我必须将它们添加到我的域中 我涉及到三个旧实体:过程、社会和活动 现在我要补充一点: 过程与社会之间的多对多关系 活动与上述M2M关系之间的多对多关系 这两种关系都有一些属性,我必须从两个方向访问它们: 我需要知道: 社会的所有过程 参与一个过程的所有社会 在社会进程中进行的所有活动 在一项活动中分析的所有社会的所有过程 与我项目中的所有其他M2M一样,我将第一个关系映射为3个对象: BaseLink

我正在开发一个旧的c应用程序,它使用iBatis作为ORM。我在建模两个新实体时遇到了一些问题,我必须将它们添加到我的域中

我涉及到三个旧实体:过程、社会和活动

现在我要补充一点:

过程与社会之间的多对多关系 活动与上述M2M关系之间的多对多关系 这两种关系都有一些属性,我必须从两个方向访问它们: 我需要知道:

社会的所有过程 参与一个过程的所有社会 在社会进程中进行的所有活动 在一项活动中分析的所有社会的所有过程 与我项目中的所有其他M2M一样,我将第一个关系映射为3个对象:

BaseLinkProcessSociety包含关系属性,处理与社会和负责人的相关性 LinkProcessSociety,通过添加Society对象来扩展基础对象 LinkSocietyProcess,通过添加Process对象扩展基本对象 这样,在我的进程对象中,我有LinkProcessSociety的列表,而在Society对象中,我有LinkSocietyProcess对象的列表

现在的问题是:如何映射第二个M2M关系?我没有一个可以描绘整个社会的物体。我必须创建它吗?我不太喜欢这个主意

还有其他更好的建模解决方案吗

编辑@Sebastian Oliveri答案

在M2M对象中,我必须添加一些属性,所以它不能是泛型的

使用ProcessOfSociety对象:

但我的问题是:如何将这个对象映射为进程对象中的属性

我想要这样的

class Process {
    var processId;
    var processDescription;
    IList<ProcessOfSociety> SocietyInvolvedList; 
}
甚至

class Society{
    var societyId;
    var societyDescription;
    IList<ProcessOfSociety> FolowedProcesses; 
}

因此,我不能在ProcessOfSociety中只有id属性。在这种情况下,您需要忘记传统关系方法中的思想,并将关系作为第一类概念。 为了将关系创建为第一类概念,首先需要创建两个相互关联的对象之一。在这种情况下,您需要一个社团,以便在您的应用程序中有:

society = new Society("my society");
societyRepository.add(society);
在应用程序的其他地方,您将获得该服务,该服务将创建与社会相关的流程:

society = societyRepository.get(societyId);
process = processRepository.get(processId);
processOfSociety = society.register(process);
processesOfSocietyRepository.add(processOfSociety);
社会阶级的过程是社会和过程之间关系的模型

class ProcessOfSociety {

    var processId;
    var societyId;

    ...

}
当然,你需要一个相关的过程。流程本身就是一个聚合流程,即AR流程,因此对上述步骤建模的前提是首先创建一个流程

您需要按照我上面描述的相同概念对活动聚合执行相同的操作。请记住,这些扮演关系角色的类拥有聚合的标识符,而不是提升断开连接模型的聚合

注意ProcessOfSociety类对关系进行建模。您需要考虑这些对象的协议是什么。如果它只是getProcessId和getSocietyId,那么您就可以考虑一个更好的抽象,可以在其他用例中重用。如果您只想对两个对象之间的关系进行多对多建模,那么您在为本文撰写的标题中会给出对此答案的回应:

class ManyToManyRelationship {

    var left;
    var right;

}
在DDD OOP中,答案往往是域语义:

更新以回答您的问题:

你不需要社会持有社会进程的清单。两者都是具有全球身份的聚合,因此它们都有自己的存储库,因此,如果您想查找社会的所有流程,则需要使用存储库:

List processesOfSociety = processesOfSocietyRepository.find(societyId)
请记住,聚合通常是值对象的一个小集合,它们的边界内可能有一个值对象列表,但如果您使一个聚合包含对另一个聚合的引用,则这是一个设计。在您的场景中,使聚合包含其他聚合的列表

希望能有帮助

class ProcessOfSociety {

    var processId;
    var societyId;

    ...

}
class ManyToManyRelationship {

    var left;
    var right;

}
List processesOfSociety = processesOfSocietyRepository.find(societyId)