删除 EF Core 中的相关数据

Delete Related Data in EF Core

具有一对多关系的两个实体使得凭证具有多个凭证详细信息,问题是从相关数据(凭证详细信息)的集合中删除一个项目然后保存实体未从中删除的更改相关的 table

删除过程如下所示:

    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 and/or VoucherDetails 实体都非常有效,仅通过直接更新凭证实体。 但是从 Voucher Details 集合中删除项目似乎不会触发针对 Voucher details 实体的删除语句。

还有什么我想念的吗?

编辑 编辑以显示 GetCompleteVoucherAsync 方法的实现

问题是您只是从凭证对象的 VoucherDetails 集合中删除项目。这与触发 EF 从 DBSet 中删除项目不同。

更改以下行:

voucher.VoucherDetails.Remove(item);

到这一行:

_dbcontext.VoucherDetail.Remove(item);