如果我有三个实体、项目、ProjectRole和个人,其中一个人可以是一个会员的不同的项目,并在不同项目的角色(例如"项目导致的",或者"项目成员")如何将你的模型,这样的关系?

在数据库中,我目前有以下tablers:项目人,ProjectRole Project_Person与PersonId&ProjectId为PK和ProjectRoleId作为一个FK关系。

我真的在损失在这里,因为所有领域模型我来似乎要打破一些"DDD"的规则。是否有任何'标准'这个问题?

我有一个看着一个精简的对象建模和那里是一个例子是什么一个项目,并ProjectMember会看起来像,但AddProjectMember()项目将呼ProjectMember.AddProject().因此项目有一个列表中的ProjectMembers,并且每个ProjectMember在返回时具有一个参考的项目。看起来有点令人费解我。

更新

在阅读更多关于这个主题,我将会尝试如下:有不同的角色,或者更好,型的关系,这是一定的 角色类型 在我的领域。例如,ProjectMember是一个独特的作用,告诉我们一些有关的关系的一个人扮演内的一个项目。它包含一个ProjectMembershipType,告诉我们更多关于它的作用将发挥。我不知道某些人将要扮演的角色内部的一个项目,所以我将模型,该模型的关系。

ProjectMembershipTypes可以创建和修改。这些可以用"的项目领导","开发"、"外部顾问"、或一些不同的东西。

一个人可以有许多的角色内的一个项目,这些角色就可以开始和结束在某一日期。这种关系是仿照类ProjectMember.

public class ProjectMember : IRole
{
    public virtual int ProjectMemberId { get; set; }
    public virtual ProjectMembershipType ProjectMembershipType { get; set; }

    public virtual Person Person { get; set; }
    public virtual Project Project { get; set; }
    public virtual DateTime From { get; set; }
    public virtual DateTime Thru { get; set; }
    // etc...
}

ProjectMembershipType:ie。"项目经理","开发商","顾问"

public class ProjectMembershipType : IRoleType
{
    public virtual int ProjectMembershipTypeId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }

    // etc...
}
有帮助吗?

解决方案

您正在制作一个多一对多的关系:一个项目可以有很多人做这个工作,而且一个人可以处理多个项目

您正在建模的关系作为项目角色,它除了作为来自人双向链接< - >项目,也记录了角色类型和启动/那人倒充填对项目角色类型。 (请注意如何英语工作的数据库“即”矗立在FK,或者在代码,指针/引用?)

由于那些FKS的,我们可以在数据库中按照从人的图表中,通过项目角色,向项目:

select a.person_id, b.project_role_id, c.project_id
from person a join project_role b on (a.id = b.person_id)
join project c on (b.project_id = c.id)
where a.person_id = ?

或者,我们可以按照它在另一个方向上,从项目:

select a.person_id, b.project_role_id, c.project_id
from person a join project_role b on (a.id = b.person_id)
join project c on (b.project_id = c.id)
where c.project_id = ?

理想地,我们希望能够做同样的在C#代码。所以,是的,我们希望有一个人有一个列表,项目有一个列表和ProjectRole引用到某个人和项目。

是,Project::addPerson( Person& )真的应该Project::addProjectRole( ProjectRole& ),除非我们决定Project::addPerson( Person& )的形式是一个方便的方法:

void Project::addPerson( Person& p ) {
  this.addProjectRole( new ProjectRole( p, &this, RoleType::UNASSIGNED ) ;
}

一个ProjectRole不具有一个列表,它具有 - 一个以一个人与一个项目的引用参考。它也有,作为值,开始日期,结束日期,和一个角色类型(其或者是一个枚举,或一个类的实例,模仿枚举值 - 即,有每枚举类型只有一个对象,它的无状态的,不可变的,幂等,并且因此许多ProjectRoles之间共享)。

现在这不应意味着从数据库中检索一个人应该造成整个数据库中的代码中的对象图来具体化;懒惰的代理只检索使用上可以从拯救我们。那么,如果我们只目前正与有关人士,而不是他的角色(和项目,我们可以只检索的人。(NHibernate的,举例来说,我觉得这是否更多或更少的无缝连接。)

基本上,我认为:

1)这是一个表示许多一对多关系的标准方式; 2)这是标准的关系有更多的数据(何时,什么样的) 和; 3)你已经差不多有正确的想法,只是被在这里获得反馈正确尽责。

其他提示

这里是我会怎么处理它:

class Person
{
  string Name { get; set; }
  IList<Role> Roles { get; private set; }
}

class Role
{
  string Name { get; set; }
  string Description { get; set; }
  IList<Person> Members { get; private set; }
}

class Project
{
  string Name { get; set; }
  string Description { get; set; }
  IList<ProjectMember> Members { get; private set; }
}

class ProjectMember
{
  Project Project { get; private set; }
  Person Person { get; set; }
  Role Role { get; set; }
}

ProjectMember 类带来他们都在一起。这种模式可以灵活分配同一个人不同的项目中与不同的角色(例如他可能是一个开发上将,并测试在ProjectB).

请不要创造作用的具体课程,课程中已经学会了。

我已经创建了一个 样本应用程序 为了证明这一(它包括关系太):

  1. 跑"bin\debug olesRelationshipsSample.exe"
  2. 双击库图标,以创建实体
  3. 拖/放他们分配适当的关系

觉得免费播放的代码。希望你能找到它很有用。

你是不是混淆了一个人在一个项目中的角色一个角色的“说明”?添加“RoleDescription”的概念(一个“角色一流”可以这么说),以及“RoleInstance”对象指的是实际的个人项目中可能会有帮助。

您有什么额外的数据,作用一个多一对多的关系。我们除了在我们的例子中的人可能对项目多重角色类似的结构,所以我有同样的问题挣扎。一种解决方案是创建扩展Person和增加的作用特性的ProjectPerson类:

public class ProjectPerson : Person
{
    public string Role { get; set; }
}

您项目类现在有ProjectPerson的集合,但Person类有项目的集合,因为它没有任何意义,延长项目类添加角色。你必须做一些额外的工作(仰望人ProjectPerson集合中)找到从人的角度来看,项目的作用。

一个第二溶液是处理具有附加数据多到多的关系的标准方式。创建ProjectRole类,它模拟从项目和人员两个一对多关系的许多方面。也就是说,两个项目和Person各自具有ProjectRole的集合。

考虑您的数据访问策略将如何很好地支持模型选择一个解决方案是非常重要的。你要避免场景中加载的收集需要一个或多个趟数据库集合中的每个对象。

看来,有两个主要实体 - 项目和项目成员。 该项目成员具有属性“成员角色”和“公司名称”。其中一种属性的可能属于即一组值,可以在这两个出于方便和用于搜索查找表来保持的结构域。假设某人大约需要进行特定的角色/工作所有项目成员的信息。

请注意。查找表可以添加条目,但通常不会有改变的项的值。一旦值从查找表中选择,然后它被认为是所属表的永久固定 - 在这种情况下,项目成员表。

我不希望看到在不同于便利作为查找表之外的任何业务一个“人”实体或表如在上面的情况。 HR部门将继续有由工资等要求,但并没有什么根本紧靠人民,业务需要知道具体信息的雇员名单。 NB找到业务流程,以确定一个实体 - 不让它起来。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top