Ho un problema molto specifico, sul quale vorrei chiedere aiuto. Sto usando .NET Core 2.1.1 con EF Core 2.1.1. Sto usando il primo approccio al codice e attualmente sto progettando un modello di dominio per la mia applicazione.
Quindi ho il seguente requisito: ho una classe TrainingItem
, che contiene informazioni di base sulla formazione. TrainingItem
contiene anche un elenco di partecipanti, quindi sto utilizzando la relazione many-to-many tra TrainingItem
e TrainingEmployee
. Il problema è che ho un requisito che TrainingItem
dovrebbe contenere un elenco di dipendenti che stanno aspettando questo addestramento, quindi ho trovato il seguente approccio:
public class TrainingItem
{
// ... properties for Training
public virtual ICollection<TrainingEmployeeTrainingItem> Attendees {get;set;} = new List<TrainingEmployeeTrainingItem>();
public virtual ICollection<TrainingEmployeeTrainingItem> WaitingList {get;set;} = new List<TrainingEmployeeTrainingItem>();
}
public class TrainingEmployee
{
// ... properties for Employee
public virtual ICollection<TrainingEmployeeTrainingItem> TrainingEmployeeTrainingItems {get;set;} = new List<TrainingEmployeeTrainingItem>();
}
public class TrainingEmployeeTrainingItem
{
public int TrainingEmployeeId {get;set;}
public virtual TrainingEmployee TrainingEmployee {get;set;}
public int TrainingItemId {get;set;}
public virtual TrainingItem TrainingItem {get;set;}
}
// this is my model creating method in db context
protected override void OnModelCreating(ModelBuilder builder)
{
// many-to-many
builder.Entity<TrainingEmployeeTrainingItem>()
.HasKey(x => new { x.TrainingEmployeeId, x.TrainingItemId });
}
Quindi, come puoi vedere, il primo elenco di partecipanti può essere mappato con una soluzione alternativa attualmente in EF Core utilizzata per mappare le relazioni molti-a-molti.
Ma la domanda è, come posso mappare WaitingList?
Hai bisogno di un'entità extra per molti a molti, quindi solo TrainingEmployeeTrainingItem
non funzionerà.
Prova quanto segue:
public class TrainingItem
{
// ... properties for Training
public virtual ICollection<AttendeeTrainingEmployeeTrainingItem> Attendees {get;set;} = new List<AttendeeTrainingEmployeeTrainingItem>();
public virtual ICollection<WaitingListTrainingEmployeeTrainingItem> WaitingList {get;set;} = new List<WaitingListTrainingEmployeeTrainingItem>();
}
public class TrainingEmployee
{
// ... properties for Employee
public virtual ICollection<AttendeeTrainingEmployeeTrainingItem> AttendingTrainings {get;set;} = new List<AttendeeTrainingEmployeeTrainingItem>();
public virtual ICollection<WaitingListTrainingEmployeeTrainingItem> AwaitingTrainings {get;set;} = new List<WaitingListTrainingEmployeeTrainingItem>();
}
public abstract class TrainingEmployeeTrainingItem
{
public int TrainingEmployeeId {get;set;}
public virtual TrainingEmployee TrainingEmployee {get;set;}
public int TrainingItemId {get;set;}
public virtual TrainingItem TrainingItem {get;set;}
}
public class AttendeeTrainingEmployeeTrainingItem : TrainingEmployeeTrainingItem
{
}
public class WaitingListTrainingEmployeeTrainingItem : TrainingEmployeeTrainingItem
{
}
// this is my model creating method in db context
protected override void OnModelCreating(ModelBuilder builder)
{
// many-to-many
builder.Entity<AttendeeTrainingEmployeeTrainingItem>()
.HasKey(x => new { x.TrainingEmployeeId, x.TrainingItemId });
builder.Entity<WaitingListTrainingEmployeeTrainingItem>()
.HasKey(x => new { x.TrainingEmployeeId, x.TrainingItemId });
}
Ho risposto a questa domanda prima (vale la pena notare che la tua domanda non è un duplicato perché è per EF di base e non vecchia scuola).
Puoi applicare InversePropertyAttribute
alle tue raccolte.