Удалить связанные данные в EF Core - PullRequest
3 голосов
/ 08 июля 2019

Два объекта с отношением один ко многим, так что в ваучере много деталей ваучера, проблема заключается в удалении одного элемента из коллекции связанных данных (детали ваучера) и последующем сохранении изменений, которые не удаляются из связанного объекта. таблица

Процедура удаления выглядит следующим образом:

    var voucher = await _voucherRepository.GetCompleteVoucherAsync(Id);
    var item = voucher.VoucherDetails.FirstOrDefault();
    voucher.VoucherDetails.Remove(item);
    _dbContext.Update(voucher);    
    await _dbContext.SaveChangesAsync();

А модель выглядит так:

 public class Voucher : BaseEntity
 { 
        public int Id {get; set;}
        -----
        public ICollection<VoucherDetail> VoucherDetails { get; set; }
 }

 public class VoucherDetail : BaseEntity
 {
        public int Id {get; set;}
        -----
        public int VoucherId { get; set; }
        public Voucher Voucher { get; set; }
 }

и вот контекст:

builder.HasOne(i => i.Voucher)
           .WithMany(i => i.VoucherDetails)
           .IsRequired().HasForeignKey(i => i.VoucherId)
           .OnDelete(DeleteBehavior.Cascade);

Репозиторий:

public async Task<Voucher> GetCompleteVoucherAsync(int id)
        {
            return await _dbContext.Vouchers
            .Include(i => i.VoucherSource)
            .Include(i => i.VoucherDetails)
            .ThenInclude(i => i.Assets)
            .SingleOrDefaultAsync(s => s.Id == id);
        }

При вышеупомянутой установке процедуры вставки и обновления отлично работают как для сущностей Voucher, так и / или VoucherDetails, только напрямую обновляя сущность Voucher. но удаление элемента из коллекции сведений о ваучере, по-видимому, не вызывает оператора удаления для объекта сведений о ваучере.

Есть ли еще что-то, что я пропускаю?

Редактировать Отредактировано, чтобы показать реализацию метода GetCompleteVoucherAsync

1 Ответ

1 голос
/ 08 июля 2019

Проблема в том, что вы просто удаляете элемент из коллекции VoucherDetails объекта ваучера. Это не то же самое, что запуск EF для удаления элемента из DBSet.

Измените следующую строку:

voucher.VoucherDetails.Remove(item);

К этой строке:

_dbcontext.VoucherDetail.Remove(item);
...