Entity Framework 更新失败,调试后发现是AsNoTracking的原因
- public override int SaveChanges()
- {
- var changedEntities = ChangeTracker.Entries().Where(e => e.State == EntityState.Added || e.State == EntityState.Modified).ToList();
- var now = DateTime.Now;
- changedEntities.ForEach(e =>
- {
- if (e.State == EntityState.Added)
- {
- var createTimeProperty = e.Entity.GetType().GetProperty("CreateTime");
- var createUserIdProperty = e.Entity.GetType().GetProperty("CreateUserId");
- var createUserNameProperty = e.Entity.GetType().GetProperty("CreateUserName");
- if (createTimeProperty != null)
- {
- createTimeProperty.SetValue(e.Entity, now);
- }
- if (createUserIdProperty != null)
- {
- createUserIdProperty.SetValue(e.Entity, InternalContext.UserId);
- }
- if (createUserNameProperty != null)
- {
- createUserNameProperty.SetValue(e.Entity, InternalContext.UserName);
- }
- var updateTimeProperty = e.Entity.GetType().GetProperty("UpdateTime");
- var updateUserIdProperty = e.Entity.GetType().GetProperty("UpdateUserId");
- var updateUserNameProperty = e.Entity.GetType().GetProperty("UpdateUserName");
- if (updateTimeProperty != null)
- {
- updateTimeProperty.SetValue(e.Entity, now);
- }
- if (updateUserIdProperty != null)
- {
- updateUserIdProperty.SetValue(e.Entity, InternalContext.UserId);
- }
- if (updateUserNameProperty != null)
- {
- updateUserNameProperty.SetValue(e.Entity, InternalContext.UserName);
- }
- }
- else if (e.State == EntityState.Modified)
- {
- var isDeleteProperty = e.Entity.GetType().GetProperty("IsDelete");
- if (isDeleteProperty != null && (bool)isDeleteProperty.GetValue(e.Entity))
- {
- var deleteTimeProperty = e.Entity.GetType().GetProperty("DeleteTime");
- var deleteUserIdProperty = e.Entity.GetType().GetProperty("DeleteUserId");
- var deleteUserNameProperty = e.Entity.GetType().GetProperty("DeleteUserName");
- if (deleteTimeProperty != null)
- {
- deleteTimeProperty.SetValue(e.Entity, now);
- }
- if (deleteUserIdProperty != null)
- {
- deleteUserIdProperty.SetValue(e.Entity, InternalContext.UserId);
- }
- if (deleteUserNameProperty != null)
- {
- deleteUserNameProperty.SetValue(e.Entity, InternalContext.UserName);
- }
- }
- else
- {
- var updateTimeProperty = e.Entity.GetType().GetProperty("UpdateTime");
- var updateUserIdProperty = e.Entity.GetType().GetProperty("UpdateUserId");
- var updateUserNameProperty = e.Entity.GetType().GetProperty("UpdateUserName");
- if (updateTimeProperty != null)
- {
- updateTimeProperty.SetValue(e.Entity, now);
- }
- if (updateUserIdProperty != null)
- {
- updateUserIdProperty.SetValue(e.Entity, InternalContext.UserId);
- }
- if (updateUserNameProperty != null)
- {
- updateUserNameProperty.SetValue(e.Entity, InternalContext.UserName);
- }
- }
- }
- });
- return base.SaveChanges();
- }
先看以上代码,我们封装了一个SaveChanges的方法,用来提交实体的修改或插入操作,这个操作有个好处就是不用写事务,如果你需要插入多张表,并且是要么全部成功,要么全部失败,那使用这个方法就很方便了。
不过今天遇到一个更新的问题,始终没有报错,但就是无法更新。
后来调试代码,发现一个很关键的地方:AsNoTracking()
针对查询,在一些情况下,我们只需要返回一个只读的数据就可以,并不会对数据记录进行任何的修改。
这种时候不希望Entity Framework进行不必要的状态变动跟踪,可以使用Entity Framework(EFCore中也有哦)的AsNoTracking方法来查询返回不带变动跟踪的查询结果。
由于是无变动跟踪,所以对返回的数据的没有进行任何修改,在SaveChanges()时,都不会提交到数据库中。
所以,我上图中的代码虽然下面修改了IsDelete=true,但是我在查询的时候已经加入了AsNoTracking,当我SaveChange的时候,这个修改并不会被提交,所以无法完成更新。
我们在做数据集合查询显示,而又不需要对集合修改并更新到数据库的时候,
一定不要忘记加上AsNoTracking。
如果查询过程做了select映射就不需要加AsNoTracking。
如:db.user.Where(t=>t.Name.Contains("小明")).select(t=>new (t.Name,t.Age)).ToList();
Entity Framework 更新失败,调试后发现是AsNoTracking的原因的更多相关文章
- Oracle + Entity Framework 更新没有设置主键的表
最近用Entity Framework 开发的时候,发现一个问题,在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作. 那么,应该怎么处理没有主键的表呢? 我们打开这个表的edmx文件 ...
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
在日常使用Entity Framework中,数据更新通常会用到.下面就简单封装了一个DBContext类 public partial class EFContext<T> : DbCo ...
- entity framework 连接 oracle 发布后出现的问题(Unable to find the requested .Net Framework Data Provider)
用entity framework 搭建的一个windows 程序,在vs中用oracle 的ODT 工具连接oracle数据库,昨天发布后出现下面一个错误, System.ArgumentExcep ...
- Entity Framework 更新模式之Attach与EntityState.Modified模式的区别
数据库中有一个City表 初始时数据: 实体类与Fluent Api配置映射 public class City { public int Id { get; set; } public string ...
- 解决Entity Framework查询匿名对象后的跨域访问的一种方式
在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递.但是很多时 ...
- C# Entity Framework 更新数据的三种方法
例: 实体类: public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public ...
- EntityFramework_MVC4中EF5 新手入门教程之六 ---6.通过 Entity Framework 更新关联数据
在前面的教程中,您将显示相关的数据 :在本教程中,您会更新相关的数据.对于大多数的关系,这个目标是可以通过更新相应的外键字段来达到的.对于多对多关系,实体框架并不直接,暴露联接表,因此您必须显式添加和 ...
- xcode 更新svn/Git后发现模拟器显示No Scheme问题
这个是由于XXX..xcodeproj包中xcuserdata文件夹中user.xcuserdatad文件夹名字的问题...user.xcuserdatad文件夹的名字,不是当前用户的名字,就会显示n ...
- Entity Framework 更新带外键的实体为null
using (var ctx = new PortalContext()){ var city = ctx.Cities.Find(42); ctx.Entry(city) ...
随机推荐
- P3619 魔法
考虑两个任务 \(1\) 和 \(2\),当前时间为 \(T\),两个任务都要完成. 先完成任务 \(1\) 的条件是 \(T>t_1\) 且 \(T+b_1>t_2\),先完成任务 \( ...
- JavaSE 学习笔记05丨泛型、集合
Chapter. 10 泛型 10.1 泛型程序设计 泛型,指可以在类或方法中预支地使用未知的类型.泛型程序设计(Generic programming),意味着编写的代码可被很多不同类型的对象所重用 ...
- otter搭建
转载: https://blog.csdn.net/inthat/article/details/93595156 https://www.cnblogs.com/Inspire-Yi/p/80943 ...
- 帆软用工具测试超链接打开弹窗(iframe嵌套),解决js传参带中文传递有乱码问题
1.新建超链接 随意点击一个单元格右击,选择 超级链接 2.在弹出的窗口中选择JavaScript脚本 如图: 其中红框框出的是几个要点 ,左边的就不讲了,右上角的参数cc是设置了公式remote ...
- chrome浏览器查看当前页面cookie
方法一:点进去设置--高级--网站设置--权限cookie--查找所有cookie和网站数据,就可以看到所有的cookie信息了,举例: 方法二:键盘F12,找到network--点击Doc(如果没有 ...
- Django之数据库--ORM
一.建立数据库模型类 1.在model里创建模型类.(继承models.Model) from django.db import models # Create your models here. c ...
- springsecurity+springsocial资料收集
https://blog.csdn.net/tryandfight/article/details/80524573 https://niocoder.com/2018/01/09/Spring-Se ...
- 老猿学5G:融合计费场景的Nchf_ConvergedCharging_Create、Update和Release融合计费消息交互过程
☞ ░ 前往老猿Python博文目录 ░ 一.Nchf_ConvergedCharging_Create交互过程 Nchf_ConvergedCharging_Create 服务为CTF向CHF请求提 ...
- 第7.11节 案例详解:Python类实例变量
上节老猿介绍了实例变量的访问方法,本节结合一个具体案例详细介绍实例变量访问. 本节定义一个Vehicle类(车),它有三个实例变量self.wheelcount(轮子数).self.power(动力) ...
- PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件的currentWidget和widget方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTabWidget的每个选项卡都有一个对应的页面部件对象,可用通过currentWidget方法和 ...