删除未在实体框架中使用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
的情况下删除子集合?
尝试通过添加"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();