1. var entitys= Repository.Table.Where(a => ids.Contains(a.UUID)).ToList();
  2. entitys.ForEach(a =>
  3. {
  4.   //foreach (var deductionitem in a.Deductionitems){} //取出来就删除不了了
  5.  
  6.   var items=a.Deductionitems
  1.   DoDelete(a);
    });

DeductionItems和主表配了级联删除,代码执行时会抛The relationship could not be changed because one or more of the foreign-key properties is non-nullable

场景为:删除主表时,在其对应的子表集合中,从子表通过导航属性去更新另外一个表的某个合计字段

解决方法:

遍历子表后,EF无法分辨该记录是否要保留。所以需要手动删除从表,不能再依赖级联删除

附上主表实体部分字段

  1. public class MaterialSupplierPayApply : BaseSupplierPayApply
  2. {
  3. public MaterialSupplierPayApply() { }
  4.  
  5. public MaterialSupplierPayApply(Currency currency, decimal exchangeRate, MaterialSupplier supplier)
  6. : base(currency, exchangeRate, supplier)
  7. {
  8.  
  9. }
  10.  
  11. public override string SysBillTypeCode => FuncCodeConst.Scm.MATERIALSUPPLIERPAYAPPLY;
  12.  
  13. private List<MaterialSupplierPayDeductionItem> _deductionItems;
  14. /// <summary>
  15. /// 应付扣款明细
  16. /// </summary>
  17. public virtual List<MaterialSupplierPayDeductionItem> DeductionItems
  18. {
  19. get => _deductionItems ?? (_deductionItems = new List<MaterialSupplierPayDeductionItem>());
  20. set => _deductionItems = value;
  21. }
  22.  
  23. }

以下为子表实体

  1.  
  1. /// <summary>
  2. /// 应付扣款明细
  3. /// </summary>
    public class MaterialSupplierPayDeductionItem:BaseEntityLog
  1. {
  2. public MaterialSupplierPayDeductionItem() { }
  3. public MaterialSupplierPayDeductionItem(MaterialSupplierPayableDeduction materialSupplierPayableDeduction,Guid billId)
  4. {
  5. BillId = billId;
  6. materialSupplierPayableDeduction.WriteOffStatus = WriteOffStatus.WriteOffing;
  7. MaterialSupplierPayableDeduction = materialSupplierPayableDeduction;
  8. }
  9. /// <summary>
  10. /// 付款申请
  11. /// </summary>
  12. public Guid BillId { get; set; }
  13. /// <summary>
  14. /// 材料商应付扣款Id
  15. /// </summary>
  16. public Guid MaterialSupplierPayableDeductionId { get; set; }
  17. /// <summary>
  18. /// 备注
  19. /// </summary>
  20. public string Description { get; set; }
  21. #region 导航属性
  22. /// <summary>
  23. /// 材料商付款申请
  24. /// </summary>
  25. public virtual MaterialSupplierPayApply MaterialSupplierPayApply { get; set; }
  26. /// <summary>
  27. /// 材料商应付扣款
  28. /// </summary>
  29. public virtual MaterialSupplierPayableDeduction MaterialSupplierPayableDeduction { get; set; }
  30. #endregion
  31. }

EF用导航熟悉遍历从表时,删除主表出错的更多相关文章

  1. EF通过导航属性取出从表的集合后,无法删除子表

    主从表是配了级联删除的,如果通过导航属性去除从表明细删除时将报错The relationship could not be changed because one or more of the for ...

  2. Java动态 遍历List 时删除List特征元素 异常问题 及解决方案总结

    首先.这是一个极其简单的问题,大牛可忽略.新手可能会遇到,Java中遍历某个List 时删除该List元素 会抛出异常. 这一个简单的问题再高手严重不值一提,但新手可能会比較困惑,用哪种方式能够安全有 ...

  3. 将表A的数据复制到表B,以及关于主表和子表的删除办法

    如果表A的数据结构和表B的数据结构是一样的,字段名字可以不用相同,但是对应的数据类型是一样的 这样的情况下可以用如下的方式实现将表A的数据复制到表B INSERT INTO #TEMP2 SELECT ...

  4. MVC EF 移除建表时自动加上s的复数形式

    移除建表时自动加上s的复数形式 public class DBContext : DbContext { public DBContext() : base("name=DBContext& ...

  5. 【EF学习笔记10】----------主从表级联操作

    主从表 级联新增 Console.WriteLine("=========主从表 级联新增=========="); using (var db = new Entities()) ...

  6. EF Core中如何通过实体集合属性删除从表的数据

    假设在数据库中有两个表:Person表和Book表,Person和Book是一对多关系 Person表数据: Book表数据: 可以看到数据库Book表中所有的数据都属于Person表中"F ...

  7. 遍历PspCidTable表检测隐藏进程

    一.PspCidTable概述 PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的,但它与每个进程私有的句柄表有以下不同: 1.PspCidTable中存放的对象是系统中所有的进程 ...

  8. mysql存储过程之游标遍历数据表

    原文:mysql存储过程之游标遍历数据表 今天写一个mysql存储过程,根据自己的需求要遍历一个数据表,因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环境,花了不少时间才慢慢弄好,故留个痕 ...

  9. 利用EF Core的Join进行多表查询

    背景 话说有这么一家子,老公养了一条狗,老婆养了一只猫. 数据库的设计 人表 宠物表 通过表可以知道,宠物通过Owner指向主人的Id. 问题来了,我要和故事开头一样,老公-狗,老婆-猫,对应起来,怎 ...

随机推荐

  1. ACM-ICPC 2019 山东省省赛 A Calandar

    这个题,呃完全的送分题,签到题,一周只有五天,一年12个月,一个月30天,公式为((year1-year2)*360%5+(month1-month2)*30%5+day1-day2+初始星期)%5, ...

  2. String-StringBuilder-StringBuffer 的区别

    String StringBuilder StringBuffer 的区别 String:不可改变的字符串,不能够被修改                    (https://baijiahao.b ...

  3. Python (深浅拷贝)

    1.深拷贝  -->  克隆一份,修改拷贝后的内容不对原对象内容产生影响 拷贝后修改序列中元素内容,注意:被修改的元素不能为一个序列中的某个值 a = [["北京多测师",& ...

  4. 题目分享P

    题意: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双方轮流进行 操作.当一方操作时,他们需要先选择一个不为根的 ...

  5. C. Cave Painting(最小公倍数的应用)

    \(\color{Red}{网上的题解都是投机取巧啊,虽然也没错}\) \(Ⅰ.先说一下投机取巧的方法\) \(自己写几个例子会发现k很小的时候满足条件的n就变得很大\) \(所以我们直接暴力从1判断 ...

  6. 线段树 区间合并 F - Sequence operation

    F - Sequence operation 题解:这个题目不是一个特别难的题目,但是呢,写了好久,首先线段树难敲,其次就是bug难找,最后这个代码都被我改的乱七八糟的了,这个有两个地方要注意一下,一 ...

  7. 使用Hystrix的插件机制,解决在使用线程隔离时,threadlocal的传递问题

    背景 在我们的项目中,比较广泛地使用了ThreadLocal,比如,在filter层,根据token,取到用户信息后,就会放到一个ThreadLocal变量中:在后续的业务处理中,就会直接从当前线程, ...

  8. Spring Cloud 系列之 Config 配置中心(一)

    服务配置现状 配置文件是我们再熟悉不过的,在微服务系统中,每个微服务不仅仅只有代码,还需要连接其他资源,例如数据库的配置或功能性的开关 MySQL.Redis .Security 等相关的配置.除了项 ...

  9. node.js开发指南系列(1)partial is not defined

    ejs视图引擎中使用partial函数: <ul><%- partial('listitem', items) %></ul> 报错:partial is not ...

  10. 5.7.17版本mysqlbinlog实时拉取的二进制日志不完整的原因分析

    问题描述: 同事使用mysqlbinlog工具的--read-from-remote-server --raw选项,从远程实例实时拉取二进制日志时,发现得到的二进制日志文件大小与远程实例上的源文件大小 ...