簡體   English   中英

如何在實體框架中有效地級聯刪除

[英]How to do cascade delete efficiently in Entity Framework

我一直在尋找執行級聯刪除的高性能方法,但一直未能做到。 似乎我必須使用.Include()來加載任何依賴項,然后再將IQueryable傳遞給RemoveRange() ,這要花很長時間,因為它首先將所有這些條目加載到內存中。

有沒有一種方法可以直接使用EF直接發出SQL命令來刪除有問題的實體以及任何依賴關系?

有幾種刪除多個實體的方法:

  • 手動刪除所有內容。 這樣,您必須先將它們加載到不需要的內存中。

  • 配置級聯刪除規則,以便您的數據庫將為您刪除依賴項。

  • 您可以使用像這樣的第三方擴展名來手動刪除所需的擴展名,但是不需要往返數據庫,也不需要在上下文中加載任何內容。

如果使用UnitOfWork,則可以使用ExecuteSqlCommandAsync執行sql

 public async Task<int> ExecuteCommandAsync(string sqlCommand, params object[] parameters)
        {
            return await this.DataContext.Database.ExecuteSqlCommandAsync(sqlCommand, parameters);
        }

或者,如果您直接使用上下文

using(var context = new SampleContext())
{
    var commandText = "Delete from MyTable where Id=@id";
    var name = new SqlParameter(@id", 1);


    context.Database.ExecuteSqlCommand(commandText, name);
    context.SaveChanges();
}

使用Fluent API配置實體以使用WillCascadeOnDelete()關閉級聯刪除

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>()
            .HasOptional<Standard>(s => s.Standard)
            .WithMany()
            .WillCascadeOnDelete(false);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM