EF 使用lambda表达式 更新一对多数据时报错
1、需求
更新一对多表中的附表数据,表结构如下:

2、思路
个人觉得一个个去对比关联的附表数据是删除还是添加比较麻烦,就直接清空主表关联的附表,然后重新建立关联关系。
3、弊端
如果附表(前提是附表的ID是自增的)还关联着其它表就会丢失他们之间的关联关系
4、主要代码
//创建语句查询查询出主表(WaterSamplingPoint)和附表(ExpansionCleaningRecord)
var wsp = _db.WaterSamplingPoint.Include(i => i.ExpansionCleaningRecords).Where(p => p.Id == model.Id).FirstOrDefault(); if (wsp == null)//如果主表记录不存在就添加记录
{
_db.WaterSamplingPoint.Add(model);
}
else //有主表记录就修改主表记录和更新附表数据
{
_db.ExpansionCleaningRecord.RemoveRange(wsp.ExpansionCleaningRecords);//标记和主表关联的附表数据为删除状态(可加可不加,不加会产生冗余数据)
wsp.ExpansionCleaningRecords = model.ExpansionCleaningRecords; //将前台传过来的主表关联的附表数据赋给需要修改的数据库主表数据
_db.Entry(wsp).State = System.Data.Entity.EntityState.Modified; //将数据库中的主表记录标记为修改
_db.Entry(wsp).CurrentValues.SetValues(model); //更新主表属性
}
int count = _db.SaveChanges();//执行修改命令
if (count > )
{
return true;
}
return false;
5、注意事项
1)、红色代码可加可不加,不添加会产生冗余数据
2)、在查询语句中添加.AsNoTracking()语句数据库将不会对附表进行增删改的操作,如果有红色代码还会报“无法删除此对象,因为未在 ObjectStateManager 中找到它”的错误,如下图所示:

使用“AsNoTracking”表示不跟踪查询的实体,则在SaveChanges()期间,实体中的附表的更改不会保存到数据库。详细说明
EF 使用lambda表达式 更新一对多数据时报错的更多相关文章
- Entity Framework 通过Lambda表达式更新指定的字段
本来需要EF来更新指定的字段,后来在园子里找到了代码 var StateEntry = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectS ...
- ntpdate更新系统时间时报错Can't find host ntp1.aliyun.com: Servname not supported for ai_socktype (-8)
ntpdate更新系统时间时报错Can't find host ntp1.aliyun.com: Servname not supported for ai_socktype (-8) 所报错误: [ ...
- mysql更新表数据时报错 You can't specify target table 'RES_CATALOG_CLASSIFY' for update in FROM clause
You can't specify target table for update in FROM clause含义:不能在同一表中查询的数据作为同一表的更新数据. 将sql语句 UPDATE RES ...
- Error Code: 1175 Mysql中更新或删除时报错(未带关键字条件)
SET SQL_SAFE_UPDATES = 0; SQL_SAFE_UPDATES = {0 | 1} 如果设置为0,则MySQL会放弃在WHERE子句或LIMIT子句中不使用关键字的UPDATE或 ...
- lambda函数、lambda表达式
C++11 新特性:Lambda 表达式 豆子 2012年5月15日 C++ 10条评论 参考文章:https://blogs.oracle.com/pcarlini/entry/c_1x_tidbi ...
- C++11 新特性:Lambda 表达式
参考文章:https://blogs.oracle.com/pcarlini/entry/c_1x_tidbits_lambda_expressions 或许,Lambda 表达式算得上是 C++ 1 ...
- flink中使用lambda表达式
flink中使用lambda表达式 1.使用lambda的一个示例 2.使用上面这种写法通常或得到如下错误 3.解决方案 4.建议 5.完整代码 在 java8中有一种新的语法糖,即 lambda表达 ...
- 在EF中使用Expression自动生成p=>new Entity(){X="",Y="",..}格式的Lambda表达式灵活实现按需更新
一.基本介绍 回忆:最早接触Expression是在学校接触到EF的时候,发现where方法里的参数是Expression<Func<T,bool>>这么一个类型,当 ...
- EF core 中用lambda表达式和Linq的一些区别
转眼一看,又过了10几天没有写博客了,主要还是没有什么可以写的,因为遇到的问题都不是很有价值.不过最近发现用lambda表达式,比用Linq的代码量会少一些,而且也方便一些.不过两者都差不多,相差不是 ...
随机推荐
- [转]Java多线程学习(总结很详细!!!)
Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...
- Attention is all your need 谷歌的超强特征提取网络——Transformer
过年放了七天假,每年第一件事就是立一个flag——希望今年除了能够将技术学扎实之外,还希望能够将所学能够用来造福社会,好像flag立得有点大了.没关系,套用一句电影台词为自己开脱一下——人没有梦想,和 ...
- sorted排序算法
- Navicat for MySQL 使用SSH方式链接远程数据库(二)
这里我们使用SSH连接远程mysql数据库 2 SSH这种方式,可以使我们连接到远程服务器,但是现在并不能访问数据库,因为我们还没有连接到数据库 3 既然已经连接到服务器了,我们就该连接服务器上的数据 ...
- Vue 组件切换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Django入门7--博客撰写页面开发
- 2018-8-10-C#-局部函数与事件
title author date CreateTime categories C# 局部函数与事件 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17:23 ...
- 【u107】数字游戏(bds)
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行 ...
- Loj2604开车旅行
Loj2604开车旅行 我完全没有看出这道题哪里是DP 首先,一个位置向后的最近和第二近我们可以通过set去简单实现 通过维护最大和次大即可 至于高度相同的情况我们可以通过先在set中查询小的来实现 ...
- dynamic web module version
Ser vlet 3十二月2009开发平台标准版6,6可插性,易于开发,异步ser vlet,安全,文件上传 Ser vlet 2.5九月2005开发平台标准版5,5需要平台标准版5,支持注释 Ser ...