删除子集合而不使用实体框架中的包含

时间:2016-11-03 11:36:27

标签: c# entity-framework

我想在不加载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的情况下删除子集合?

2 个答案:

答案 0 :(得分:0)

尝试通过添加“虚拟”来进行延迟加载

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 }
}

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

答案 1 :(得分:0)

你可以试试这个

  

DbContext有一些名为Entry和Entry的方法,这些方法   获取给定实体的DbEntityEntry并提供对该实体的访问权限   有关实体的信息并返回能够执行的DbEntityEntry对象   对实体执行操作。现在我们可以执行删除   通过仅将实体状态更改为上下文来操作   EntityState.Deleted

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();