删除EF Core中的相关数据

hal*_*aed 7 entity-framework-core asp.net-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();
Run Code Online (Sandbox Code Playgroud)

模型看起来像:

 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; }
 }
Run Code Online (Sandbox Code Playgroud)

这是上下文:

builder.HasOne(i => i.Voucher)
           .WithMany(i => i.VoucherDetails)
           .IsRequired().HasForeignKey(i => i.VoucherId)
           .OnDelete(DeleteBehavior.Cascade);
Run Code Online (Sandbox Code Playgroud)

存储库:

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);
        }

Run Code Online (Sandbox Code Playgroud)

通过上述设置,只需直接更新凭证实体,插入和更新过程就可以完美地适用于凭证和/或 VoucherDetails 实体。但从凭证详细信息集合中删除项目似乎不会触发针对凭证详细信息实体的删除语句。

我还缺少什么吗?

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

Ton*_*ams 2

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

更改以下行:

voucher.VoucherDetails.Remove(item);
Run Code Online (Sandbox Code Playgroud)

到这一行:

_dbcontext.VoucherDetail.Remove(item);
Run Code Online (Sandbox Code Playgroud)

  • 我同意@halfraed。我希望 EF 能够识别出集合中的某个项目已消失;正如它认识到新事物的存在一样;关于更新。您不必担心在一种情况下手动修改上下文,而在另一种情况下忽略它。这对我来说是 EF 的限制。如果您找到了一种方法来完成这项工作,请告诉我,我也面临着同样的问题。 (11认同)
  • 我知道这会起作用,但我希望 EF 能够通过父集合处理删除,就像它处理插入和更新场景一样。问题是(EF 是否针对子/相关项目集合中丢失的项目发出删除语句?) (2认同)