EF:没有首先获取数据的清除收集属性

时间:2016-04-19 16:47:37

标签: c# entity-framework

我有一个名为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();

我认为我很接近,但它不起作用。谢谢你的建议。

1 个答案:

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