Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF Core 2.1-如何使用相同类型映射多对多_C#_.net Core_Entity Framework Core - Fatal编程技术网

C# EF Core 2.1-如何使用相同类型映射多对多

C# EF Core 2.1-如何使用相同类型映射多对多,c#,.net-core,entity-framework-core,C#,.net Core,Entity Framework Core,我有一个非常具体的问题,我想在这里寻求帮助。 我正在使用.NETCore2.1.1和EFCore2.1.1。我正在使用代码优先的方法,目前正在为我的应用程序设计一个域模型 因此,我有以下要求:我有一个TrainingItem类,其中包含有关培训的基本信息TrainingItem还包含与会者列表,因此我使用了TrainingItem和TrainingEmployee之间的多对多关系。问题是我要求TrainingItem应包含等待此培训的员工列表,因此我提出了以下方法: public class T

我有一个非常具体的问题,我想在这里寻求帮助。 我正在使用.NETCore2.1.1和EFCore2.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 });
}
公共类培训项目
{
//…用于培训的财产
公共虚拟ICollection与会者{get;set;}=new List();
公共虚拟ICollection WaitingList{get;set;}=new List();
}
公共课培训员工
{
//…员工的财产
公共虚拟ICollection TrainingEmployeeTrainingItems{get;set;}=new List();
}
公共类培训员工培训项目
{
公共int TrainingEmployeeId{get;set;}
公共虚拟培训员工培训员工{get;set;}
公共int-TrainingItemId{get;set;}
公共虚拟培训项培训项{get;set;}
}
//这是我在db上下文中创建模型的方法
模型创建时受保护的覆盖无效(ModelBuilder)
{
//多对多
builder.Entity()
.HasKey(x=>new{x.TrainingEmployeeId,x.TrainingItemId});
}
因此,正如您所看到的,可以使用EF Core中当前用于映射多对多关系的解决方案映射第一个与会者列表


但问题是,我如何映射等待列表?

您需要每多对多一个额外的实体,因此只有
培训员工培训项目
不行

请尝试以下操作:

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 });
}
公共类培训项目
{
//…用于培训的财产
公共虚拟ICollection与会者{get;set;}=new List();
公共虚拟ICollection WaitingList{get;set;}=new List();
}
公共课培训员工
{
//…员工的财产
公共虚拟ICollection AttentingTrainings{get;set;}=new List();
公共虚拟ICollection waitingTrainings{get;set;}=new List();
}
公共抽象类培训EmployeeTrainingItem
{
公共int TrainingEmployeeId{get;set;}
公共虚拟培训员工培训员工{get;set;}
公共int-TrainingItemId{get;set;}
公共虚拟培训项培训项{get;set;}
}
公共课堂参与者培训员工培训项目:培训员工培训项目
{
}
公共类等待列表培训员工培训项目:培训员工培训项目
{
}
//这是我在db上下文中创建模型的方法
模型创建时受保护的覆盖无效(ModelBuilder)
{
//多对多
builder.Entity()
.HasKey(x=>new{x.TrainingEmployeeId,x.TrainingItemId});
builder.Entity()
.HasKey(x=>new{x.TrainingEmployeeId,x.TrainingItemId});
}
我以前就说过这一点(值得注意的是,你的问题不是重复的,因为它是针对核心而不是老派EF的)


InverseProperty属性
到您的集合。

但是我需要将InverseProperty放在哪里?去哪个班?我试图了解我当前的设置和InverseProperty属性。关于
培训项目
的集合属性:
与会者
等待列表
。我从未想过这种方法,非常感谢您的帮助!谢谢!