C# Entity Framework 6.2-使用DbSet.Include()添加子级,但防止在DbSet.AddRange()上重复子级
编辑: 我知道在将实体从一个DbContext复制到另一个DbContext时如何防止重复,我的问题是关于它们的子对象。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
我有两个上下文:
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);
我的上一个问题:我想防止实体(学生)的子项(课程)重复。您的解决方案可以防止重复实体(学生),但不能防止重复其子实体(课程)。