var entitys= Repository.Table.Where(a => ids.Contains(a.UUID)).ToList(); entitys.ForEach(a => { //foreach (var deductionitem in a.Deductionitems){} //取出來就刪除不了了
var items=a.Deductionitems
DoDelete(a);
});
DeductionItems和主表配了級聯刪除,代碼執行時會拋The relationship could not be changed because one or more of the foreign-key properties is non-nullable
場景為:刪除主表時,在其對應的子表集合中,從子表通過導航屬性去更新另外一個表的某個合計字段
解決方法:
遍歷子表后,EF無法分辨該記錄是否要保留。所以需要手動刪除從表,不能再依賴級聯刪除
附上主表實體部分字段
public class MaterialSupplierPayApply : BaseSupplierPayApply { public MaterialSupplierPayApply() { } public MaterialSupplierPayApply(Currency currency, decimal exchangeRate, MaterialSupplier supplier) : base(currency, exchangeRate, supplier) { } public override string SysBillTypeCode => FuncCodeConst.Scm.MATERIALSUPPLIERPAYAPPLY; private List<MaterialSupplierPayDeductionItem> _deductionItems; /// <summary> /// 應付扣款明細 /// </summary> public virtual List<MaterialSupplierPayDeductionItem> DeductionItems { get => _deductionItems ?? (_deductionItems = new List<MaterialSupplierPayDeductionItem>()); set => _deductionItems = value; } }
以下為子表實體
/// <summary> /// 應付扣款明細 /// </summary>
public class MaterialSupplierPayDeductionItem:BaseEntityLog
{ public MaterialSupplierPayDeductionItem() { } public MaterialSupplierPayDeductionItem(MaterialSupplierPayableDeduction materialSupplierPayableDeduction,Guid billId) { BillId = billId; materialSupplierPayableDeduction.WriteOffStatus = WriteOffStatus.WriteOffing; MaterialSupplierPayableDeduction = materialSupplierPayableDeduction; } /// <summary> /// 付款申請 /// </summary> public Guid BillId { get; set; } /// <summary> /// 材料商應付扣款Id /// </summary> public Guid MaterialSupplierPayableDeductionId { get; set; } /// <summary> /// 備注 /// </summary> public string Description { get; set; } #region 導航屬性 /// <summary> /// 材料商付款申請 /// </summary> public virtual MaterialSupplierPayApply MaterialSupplierPayApply { get; set; } /// <summary> /// 材料商應付扣款 /// </summary> public virtual MaterialSupplierPayableDeduction MaterialSupplierPayableDeduction { get; set; } #endregion }