Se ho tre entità, Project, ProjectRole e Person, dove una persona può essere un membro di diversi progetti ed essere in diversi ruoli di progetto (come "Project Lead" o "Project Member") - come modellizzerete un rapporto?Come modelli i ruoli/le relazioni con Domain Driven Design in mente?
Nel database, al momento sono presenti i seguenti tablers: Progetto, Persona, ProjectRole Project_Person con PersonId & ProjectId come PK e ProjectRoleId come relazione FK.
Sono davvero in perdita qui poiché tutti i modelli di dominio che ho trovato sembrano rompere qualche regola "DDD". Ci sono degli "standard" per questo problema?
Ho dato un'occhiata a una modellazione semplificata degli oggetti e c'è un esempio di aspetto di Project e ProjectMember, ma AddProjectMember() in Project chiamerebbe ProjectMember.AddProject(). Quindi Project ha un elenco di ProjectMembers e ogni ProjectMember in cambio ha un riferimento al progetto. Sembra un po 'contorto per me.
aggiornamento
Dopo aver letto di più su questo argomento, cercherò il seguente: Ci sono ruoli distinti, o meglio, i rapporti del modello, che sono di un certo tipo ruolo nel mio dominio. Ad esempio, ProjectMember è un ruolo distinto che ci dice qualcosa sulla relazione che una persona gioca all'interno di un progetto. Contiene un ProjectMembershipType che ci dice di più sul ruolo che svolgerà. So per certo che le persone dovranno svolgere ruoli all'interno di un progetto, quindi modellerò quella relazione.
ProjectMembershipTypes può essere creato e modificato. Questi possono essere "Project Leader", "Developer", "External Adviser" o qualcosa di diverso.
Una persona può avere molti ruoli all'interno di un progetto e questi ruoli possono iniziare e terminare in una certa data. Tali relazioni sono modellate dalla classe 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. "Project Manager", "Sviluppatore", "consigliere"
public class ProjectMembershipType : IRoleType
{
public virtual int ProjectMembershipTypeId { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
// etc...
}
Non ho idea, è possibile, non sono sicuro di cosa intendi – kitsune
Ho paura di uscire dall'era del database relazionale ma ho mangiato troppo OOD ... Mi riferisco alla "seconda soluzione" in La risposta di Jamie. – xtofl