Эффективное удаление нескольких записей - PullRequest
3 голосов
/ 10 августа 2011

Я использую 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 ]

4 голосов
/ 10 августа 2011

С EF невозможно удалить их без предварительного выбора.Я просто использую обычный SQL.При использовании EF вы все равно можете выполнить обычный код SQL, например:

YourContext.Database.ExecuteSqlCommand(@"DELETE FROM Children WHERE ParentId= {0}",TheParendId);
1 голос
/ 10 августа 2011

Вы не можете использовать EF для выполнения этой массовой операции. Такие функции, как EF, L2SQL, NHibernate прекрасно справляются с управлением одним или несколькими объектами. Операции с большими объемами не учитываются при их разработке. Вам необходимо использовать запрос SQL или SP сделать это эффективным способом. DbContext предоставляет базу данных, и вы можете использовать ее для ваших запросов SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...