2011-08-10 66 views
3

我正在使用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 /存儲過程對於此功能。

回答

4

EF不可能先刪除它們。我所做的只是使用普通的SQL。當使用EF你仍然可以執行正常的SQL代碼:

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

謝謝,我有這樣的感覺。 – Magpie

1

不能使用EF做,像EF,L2SQL,NHibernate的批量operation.ORMs正在做的,在管理單個或幾個對象很大。批量操作在設計時不予考慮。您需要使用SQL查詢或SP以高效的方式執行此操作。 DbContext公開數據庫,您可以將其用於SQL查詢。