2011-08-10 9 views
3

私はEF4.1 POCOを使用しています。複数のレコードを効率的に削除する

私は彼らが私は現在のために生成されたSQLは恐ろしいです

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(); 

を持って

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); 
    } 
} 

で私のDbContextにリンクされている2つのテーブル

[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; } 
} 

を持っています。

親のすべての子をすべて削除せずに削除する関数を作成したいとします。 SQLでは、これは非常に簡単なSQL呼び出しで行うことができます。

DELETE FROM Children WHERE ParentId = @ParentId 

これはEFで可能ですか、この関数にSQL/Stored Procsを使用する必要があります。

答えて

4

EFでは、最初にEFを選択せず​​に削除することはできません。私は、通常のSQLを使用しています。 EFを使用している間、あなたはまだこのように、通常のSQLコードを実行することができます。

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

ありがとう、私はこれが事実だと感じました。 – Magpie

1

あなたがEF、L2SQL、NHibernateのようなバルクoperation.ORMsは、単一または少数のオブジェクトを管理で大活躍していることを行うためにEFを使用することはできません。バルク操作は設計時に考慮されません。効率的な方法でSQLクエリまたはSPを使用する必要があります。 DbContextはデータベースを公開し、SQLクエリに使用できます。

関連する問題