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
}

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. php并发加锁

    CleverCode在工作项目中,会遇到一些php并发访问去修改一个数据问题,如果这个数据不加锁,就会造成数据的错误.下面CleverCode将分析一个财务支付锁的问题. 1 没有应用锁机制 1.1 ...

  2. Ubuntu Install Chinese Input Method

    为了提高在Linux系统使用中文输入的体验,安装搜狗拼音输入法. 确保键盘输入系统选中fcitx. 搜狗拼音输入法基于fcitx(Free Chinese Input Toy for X)框架,所以要 ...

  3. C语言编程入门题目--No.12

    题目:判断101-200之间有多少个素数,并输出所有素数. 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数. 2.程序源代码: # ...

  4. RF(自定义关键字)

    1.在 D:\work_software\python\Lib\site-packages 文件夹下, 新建 python package 包 ,例如我的是 TestLibrary 建好后的完整路径: ...

  5. Jmeter系列(8)- test plam测试计划参数详解

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 先了解下测试计划的作用:http ...

  6. python基础入门教程(一条龙服务)

    一.语言基础 01-1 计算机系统 解释器下载 变量   小整数池 01-2 垃圾回收机制 02 数据类型 运算符(解压赋值等) 03 流程控制 if while for 04 整形 字符串 列表 0 ...

  7. OSG程序设计之Hello World 3.0

    直接上代码: #include <osgDB/ReadFile> #include <osgViewer/Viewer> #include <osgViewer/View ...

  8. Java——Java自动装箱和拆箱

    一.什么是自动装箱和拆箱: 我们知道java为8种基本类型分别提供了对应的包装类型,在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i=new I ...

  9. zigbee通用IO口小作业

    独立新建工程并编写.编译代码,实现按键控制流水灯运行,完成以下任务要求: [1]程序开始运行时,D4.D3.D6.D5灯全亮一会,然后全灭一会,开始进入流水灯. [2]流水灯的运行过程为:D4灯亮,其 ...

  10. LFU C# 实现

    周六早上  做了下力扣的LRU 题目  后面接着看了LFU 缓存  难度提高了不少 首先 先说下 这2着 的差别把 LRU :最近 最少使用算法(Least  Recently Used).LRU 是 ...