Как эффективно сделать каскадное удаление в Entity Framework - PullRequest
1 голос
/ 17 мая 2019

Я искал эффективный способ сделать каскадное удаление, но не смог. Похоже, мне нужно использовать .Include() для загрузки любых зависимостей перед передачей моего IQueryable в RemoveRange(), что занимает много времени, поскольку сначала загружаются все эти записи в памяти.

Есть ли способ просто напрямую выполнить команду SQL с помощью EF для удаления рассматриваемых объектов вместе с какими-либо зависимостями?

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Существует несколько способов удалить несколько объектов:

  • Удалить все вручную. Таким образом, вы должны сначала загрузить их в память, которая вам не нужна.

  • Настройте правила каскадного удаления , чтобы ваша база данных удаляла зависимости для вас.

  • Вы можете использовать сторонние расширения, такие как , это * , чтобы вручную удалить то, что вы хотите, но нет необходимости в обратном пути к базе данных и ничего не нужно загружать в контексте до этого.

0 голосов
/ 17 мая 2019

В случае, если вы используете UnitOfWork, вы можете выполнить sql с ExecuteSqlCommandAsync

 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...