删除EF Core中的相关数据

时间:2019-07-08 06:29:23

标签: asp.net-core entity-framework-core ef-core-2.0

两个实体具有一对多的关系,以致凭证具有许多凭证明细,问题是当从相关数据(凭证明细)的集合中删除一个项目然后保存更改时,实体并未从相关数据中删除桌子

删除过程如下:

    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实体完美地执行插入和更新过程。 但是从“凭证详细信息”集合中删除项目似乎不会触发针对“凭证详细信息”实体的删除语句。

还有什么我想念的吗?

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

1 个答案:

答案 0 :(得分:1)

问题在于您只是从voucher对象上的VoucherDetails集合中删除了该项目。这与触发EF从DBSet中删除项目不同。

更改以下行:

voucher.VoucherDetails.Remove(item);

此行:

_dbcontext.VoucherDetail.Remove(item);
相关问题