C# Entity Framework 6.2-使用DbSet.Include()添加子级,但防止在DbSet.AddRange()上重复子级

C# Entity Framework 6.2-使用DbSet.Include()添加子级,但防止在DbSet.AddRange()上重复子级,c#,entity-framework,sqlite,entity-framework-6,system.data.sqlite,C#,Entity Framework,Sqlite,Entity Framework 6,System.data.sqlite,编辑: 我知道在将实体从一个DbContext复制到另一个DbContext时如何防止重复,我的问题是关于它们的子对象。 我有两个上下文:DbContextHDD和dbcontextsb,它们都包含一门“数学”课程 DbContextHDD还包含: “历史”课程 参加“数学”课程的学生“西蒙” 参加“历史”课程的学生“杰克” 我想将所有学生实体从DbContextHDD复制到dbcontextsb,并包括dbcontextsb中尚未出现的课程实体: var students = DbCon

编辑:

我知道在将实体从一个DbContext复制到另一个DbContext时如何防止重复,我的问题是关于它们的子对象。


我有两个上下文:
DbContextHDD
dbcontextsb
,它们都包含一门“数学”
课程

DbContextHDD
还包含:

  • “历史”
    课程
  • 参加“数学”
    课程的
    学生
    “西蒙”
  • 参加“历史”课程的学生
“杰克” 我想将所有
学生
实体从
DbContextHDD
复制到
dbcontextsb
,并包括
dbcontextsb
中尚未出现的
课程
实体:

var students = DbContextHDD.Students.Include(s => s.Courses).ToList();
DbContextUSB.Students.AddRange(students);
DbContextUSB.SaveChanges();
这还会将“数学”和“历史”课程
实体从
DbContextHDD
复制到
dbcontextsb

Students.AddRange
之后,我在
dbcontextsb.Courses.Local
中有两个“Math”
Course
实体,它们都具有相同的
CourseId
SaveChanges
失败,原因是
SQLiteException:UNIQUE constraint失败

我如何避免这种情况?
我使用的是代码优先的方法。已禁用代理创建:

Configuration.ProxyCreationEnabled = false;
我有一种多对多的关系:

public class Student
{
    public Student() 
    {
        this.Courses = new HashSet<Course>();
    }

    public int StudentId { get; set; }
    [Required]
    public string StudentName { get; set; }

    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    public Course()
    {
        this.Students = new HashSet<Student>();
    }

    public int CourseId { get; set; }
    public string CourseName { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}
公共班级学生
{
公立学生()
{
this.Courses=newhashset();
}
公共int StudentId{get;set;}
[必需]
公共字符串StudentName{get;set;}
公共虚拟ICollection课程{get;set;}
}
公共课
{
公共课程()
{
this.Students=newhashset();
}
public int CourseId{get;set;}
公共字符串CourseName{get;set;}
公共虚拟ICollection学生{get;set;}
}

您是否尝试应用过滤器

var targetStudentIds=dbcontextsb.Students.Select(s=>s.StudentId.ToArray();
var sourceStudents=DbContextHDD.Students.Include(s=>s.Courses)。其中(s=>!targetstudentId.Contains(s.StudentId)).ToArray();
dbcontextsb.Students.AddRange(sourceStudents);

我的上一个问题:我想防止实体(学生)的子项(课程)重复。您的解决方案可以防止重复实体(学生),但不能防止重复其子实体(课程)。