我有一个非常具体的问题,我想在这里寻求帮助。 我将 .NET Core 2.1.1 与 EF Core 2.1.1 结合使用。我正在使用代码优先方法,目前正在为我的应用程序设计域模型。
所以我有以下要求:我有一个 TrainingItem
类,其中包含有关训练的基本信息。 TrainingItem
还包含参与者列表,因此我在 TrainingItem
和 TrainingEmployee
之间使用多对多关系。问题是我要求 TrainingItem
应包含正在等待此培训的员工列表,因此我想出了以下方法:
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 });
}
正如您所看到的,可以使用 EF Core 中当前用于映射多对多关系的解决方法来映射第一个与会者列表。
但问题是,如何映射 WaitingList?
最佳答案
每个多对多都需要一个额外的实体,因此仅 TrainingEmployeeTrainingItem
不行。
尝试以下操作:
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 });
}
关于c# - EF Core 2.1 - 如何映射具有相同类型的多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51878268/