有效删除多个记录

时间:2011-08-10 10:38:34

标签: c# entity-framework

我正在使用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 / Stored Procs来实现此功能。

2 个答案:

答案 0 :(得分:4)

如果不首先选择它们,EF就无法删除它们。我所做的就是使用普通的SQL。使用EF时,您仍然可以执行以下常规SQL代码:

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

答案 1 :(得分:1)

你不能使用EF来进行批量操作。如EF,L2SQL,NHibernate等常规用户在管理单个或几个对象方面做得很好。设计时不考虑批量操作。你需要使用SQL查询或SP以有效的方式做到这一点。 DbContext公开数据库,您可以将它用于SQL查询。