EF用導航屬性遍歷從表時,刪除主表出錯


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM