我有一个名为Facility
的班级。 Facility
上有一个名为Employees
的集合属性。我正在使用EF的断开连接层。我想从特定设施中清除Employees
集合,但我不想两次前往数据库:(1)获取所有员工,然后(2)清除。我怎么能这样做?
这是我尝试过的......
Facility f = new Facility()
{
Id = 4,
Employees = new List<Employee>()
};
context.Facilities.Attach(f);
context.Entry<Facility>(f).Collection(fac => fac.Employees).IsLoaded = true;
context.SaveChanges();
我认为我很接近,但它不起作用。谢谢你的建议。
答案 0 :(得分:0)
如果您只想使用EF,那么您总是需要一些往返。最后,EF需要生成DELETE ... WHERE Id = x
语句。如果没有先从数据库中抓取它们,它如何知道x
的值?
但是,当然,您可以以更有效的方式执行此操作,而不是获取完整的Employee
对象。它足以获得Id
值。然后,您可以使用这些Id
来创建标记为Deleted
的存根实体:
var ids = context.Empoyees.Where(e => e.FacilityId == 4)
.Select(e => e.Id).ToArray();
foreach(int id in ids)
{
var emp = new Empoyee { Id = id }; // Stub entity
context.Entry(emp).State = System.Data.Entity.EntityState.Deleted;
}
context.SaveChanges();
这是纯粹的EF。但您也可以使用EntityFramework.Extended。这允许您执行类似
的语句context.Empoyees.Where(e => e.FacilityId == 4)
.Delete();