c# - EF Core 2.1 - 如何映射具有相同类型的多对多

标签 c# .net-core entity-framework-core

我有一个非常具体的问题,我想在这里寻求帮助。 我将 .NET Core 2.1.1 与 EF Core 2.1.1 结合使用。我正在使用代码优先方法,目前正在为我的应用程序设计域模型。

所以我有以下要求:我有一个 TrainingItem 类,其中包含有关训练的基本信息。 TrainingItem 还包含参与者列表,因此我在 TrainingItemTrainingEmployee 之间使用多对多关系。问题是我要求 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/

相关文章:

c# - 在 XAML 中设置 <Window.DataContext>

c# - 如何在不使用依赖注入(inject)的情况下实例化 ILoggerFactory?

c# - AddScoped 服务不会在整个请求过程中保留设置

c# - EF Core - 添加唯一索引

c# - 如何使用 asp.net 在 GridView 中为页码加下划线

c# - 如何确保我的软件连接到正确的服务器?

c# - 遍历 XML 文档

c# - 适用于 .NET Core 的 Windows 和 Linux 之间的编码(marshal)处理有何不同?

c# - [40m[32minfo[39m[22m[49m 在 DotNetCore 日志上意味着什么

c# - 使用 IEntityTypeConfiguration<T> 配置实体时如何使用 ToJson