高效删除多条记录

本文关键字:记录 删除 高效 | 更新日期: 2023-09-27 18:05:10

我使用的是EF4.1 POCO。

我有两张表

[Table("Parent")]
public class Parent
{
   public int ParentId { get; set; }
   /.. Other fields ../
   public virtual List<Child> Children{ get; set; }
}
[Table("Child")]
public class Child
{
   public int ChildId { get; set; }
   /.. Other fields ../
   public virtual Parent Parent { get; set; }
}

它们在我的DbContext中通过

链接
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Configurations.Add(new ParentConfiguration());
}
internal class ParentConfiguration: EntityTypeConfiguration<Parent>
{
   internal ParentConfiguration()
   {
      HasMany(r => r.Children).WithRequired(o => o.Parent);
   }
}

我现在有

var parent = (from p in Parents
              where p.ParentId == parentId
              select p).FirstOrDefault();
while (parent.Children.Count > 0)
{
   Children.Remove(parent.Items[0]);
}
Context.SaveChanges();

为它生成的SQL是可怕的。

我想创建一个函数,删除父节点的所有子节点,而不首先选择它们。在SQL中,这可以通过一个非常简单的SQL调用来完成。

DELETE FROM Children WHERE ParentId = @ParentId

这是可能的与EF或我将不得不回到使用SQL/存储过程的这个功能。

高效删除多条记录

如果不先选择它们,EF是不可能删除它们的。我所做的就是使用普通的SQL。当使用EF时,您仍然可以执行像这样的普通SQL代码:

YourContext.Database.ExecuteSqlCommand(@"DELETE FROM Children WHERE ParentId= {0}",TheParendId);

您不能使用EF来进行批量操作。像EF, L2SQL, NHibernate这样的orm在管理单个或几个对象方面做得很好。批量操作在设计时没有考虑到。您需要使用SQL查询或SP以一种有效的方式来做到这一点。DbContext暴露了数据库,你可以用它来查询SQL。