两个实体具有一对多的关系,以致凭证具有许多凭证明细,问题是当从相关数据(凭证明细)的集合中删除一个项目然后保存更改时,实体并未从相关数据中删除桌子
删除过程如下:
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方法的实现
答案 0 :(得分:1)
问题在于您只是从voucher对象上的VoucherDetails集合中删除了该项目。这与触发EF从DBSet中删除项目不同。
更改以下行:
voucher.VoucherDetails.Remove(item);
此行:
_dbcontext.VoucherDetail.Remove(item);