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