尽管您忘记指定了,但在我看来,每个Foo 都有零个或多个Props,并且每个Prop 恰好属于一个Foo:标准的一对多关系。可能是多对多的关系,答案也差不多。
显然您想从一个或多个Foos 中删除所有Props。实体框架的设计目的是在一次数据库访问中获取和更改数据。您必须获取要更改的对象,更改所获取对象的一个或多个属性的值,然后调用SaveChanges()。
如果您想在一个函数中获取-更改-保存,则必须编写一个存储过程。
实体框架方法
如果你关注了entity framework code first conventions,你会得到类似的东西:
class Foo
{
public int Id {get; set;}
...
// every Foo has zero or more Props (one-to-many)
public virtual ICollection<Prop> Props {get; set;}
}
class Prop
{
public int Id {get; set;}
...
// every Prop belongs to exactly one Foo using foreign key:
public int FooId {get; set;}
public virtual Foo Foo {get; set;}
}
人们会期望,一旦您获取了Foo,调用foo.Props.Clear() 就足够了:
var fetchedFoos = dbContext.Foos.Where(foo => ...);
foreach (var fetchedFoo in fetchedFoos)
{
fetchedFoo.Props.Clear();
}
唉,as is stated in this Stackoverflow article,ICollection.Clear() 在实体框架中不起作用(至少在旧版本中不起作用。我最近没有检查过)。
如果您想删除给定Foo 的所有Props,则必须通过Prop.FooId 删除它们
创建将获取您要清除Props 集合的所有Foos 的查询。暂时不要执行查询:
var fooIds = myDbContext.Foos
.Where(foo => ...)
// I don't need the complete `Foo`, I only need the `Id`
.Select(foo => foo.Id);
我想删除所有在fooIds 中具有FooId 的Props:
var propsToDelete = dbContext.Props
.Where(prop => fooIds.Contains(prop.FooId));
查询仍未执行!
现在删除道具:
dbContext.Props.RemoveRange(propsToDelete);
dbContext.SaveChanges();
如果需要,您可以将 LINQ 连接成一个大语句。由于在 RemoveRange / SaveChanges 之前没有执行任何查询,我怀疑这是否会提高效率。它肯定会降低可读性,从而降低可测试性/可维护性