删除未在实体框架中使用include的子集合

本文关键字:include 子集合 实体 框架 删除 | 更新日期: 2023-09-27 18:16:19

我想在不加载EF中的实体的情况下删除子集合

public Class Student : Entity 
{ 
    public string Firstname { get; set; }
    Public ICollection<Course> Courses { get; set; }
}
public Class Course : Entity 
{
    public String Title { get; set; }
    public DateTime StartDate { get; set; }
    public ICollection<Student> Students { get; set }
}
public class UpdateCourseInput 
{
    public Long CourseId { get; set }
    public List<Long> RemovedStudents { get; set; }
}

什么不工作

如果我想在不使用.Include的情况下删除学生课程,我得到一个错误,childCollection为空

void async Task UpdateCourse(UpdateCourseInput input) 
{
     var course = _CourseRepository.GetAll()
                                   .Where(c => c.id--input.CourseId )
                                   .FirstOrDefault();
     foreach (var id in input.RemovedStudents)
     {
         // loading student without hitting database 
         var student = _StudentRepository.Load(id)
         course.Students.Remove(student)
     }
}

什么作品

当子集合很大时,这有性能缺陷,模型是简化模型,但在实际情况下集合包括字节数组等。

void async Task UpdateCourse(UpdateCourseInput input)
{
     var course = _CourseRepository.GetAll()
                                   .Where(c => c.id--input.CourseId )
                                   .Include(c => c.Students)
                                   .FirstOrDefault();
     foreach (var id in input.RemovedStudents)
     {
          // loading student without hitting database 
          var student = _StudentRepository.Load(id)
          course.Students.Remove(student)
     }
}

如何在不使用.Include的情况下删除子集合?

删除未在实体框架中使用include的子集合

尝试通过添加"virtual"来延迟加载

public Class Student : Entity 
{ 
   public string Firstname { get; set; }
   public virtual ICollection<Course> Courses { get; set; }
}
public Class Course : Entity 
{
   public String Title { get; set; }
   public DateTime StartDate { get; set; }
   public virtual ICollection<Student> Students { get; set }
}

Navigation属性应该定义为public, virtual。如果属性没有定义为virtual, Context将不会进行延迟加载。如果没有虚拟,则不支持延迟加载,并且在集合属性上得到null。

你可以试试这个

DbContext有两个叫做Entry和Entry的方法获取给定实体的DbEntityEntry,并提供对关于实体的信息,并返回一个DbEntityEntry对象对实体执行操作。现在我们可以执行删除操作了通过将实体状态更改为EntityState。删除

using (Entities Context = new Entities())   
{   
    DepartmentMaster deptDelete = new DepartmentMaster { DepartmentId = 6 };   
    Context.Entry(deptDelete).State = EntityState.Deleted;   
    Context.SaveChanges();   
}

var employer = new Employ { Id = 1 };
//Attach the entity to context
ctx.Employ.Attach(employer);
//Remove
ctx.Employ.Remove(employer);
ctx.SaveChanges();