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的原因的更多相关文章

  1. Oracle + Entity Framework 更新没有设置主键的表

    最近用Entity Framework 开发的时候,发现一个问题,在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作. 那么,应该怎么处理没有主键的表呢? 我们打开这个表的edmx文件 ...

  2. 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为

    在日常使用Entity Framework中,数据更新通常会用到.下面就简单封装了一个DBContext类 public partial class EFContext<T> : DbCo ...

  3. entity framework 连接 oracle 发布后出现的问题(Unable to find the requested .Net Framework Data Provider)

    用entity framework 搭建的一个windows 程序,在vs中用oracle 的ODT 工具连接oracle数据库,昨天发布后出现下面一个错误, System.ArgumentExcep ...

  4. Entity Framework 更新模式之Attach与EntityState.Modified模式的区别

    数据库中有一个City表 初始时数据: 实体类与Fluent Api配置映射 public class City { public int Id { get; set; } public string ...

  5. 解决Entity Framework查询匿名对象后的跨域访问的一种方式

    在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递.但是很多时 ...

  6. C# Entity Framework 更新数据的三种方法

    例: 实体类: public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public ...

  7. EntityFramework_MVC4中EF5 新手入门教程之六 ---6.通过 Entity Framework 更新关联数据

    在前面的教程中,您将显示相关的数据 :在本教程中,您会更新相关的数据.对于大多数的关系,这个目标是可以通过更新相应的外键字段来达到的.对于多对多关系,实体框架并不直接,暴露联接表,因此您必须显式添加和 ...

  8. xcode 更新svn/Git后发现模拟器显示No Scheme问题

    这个是由于XXX..xcodeproj包中xcuserdata文件夹中user.xcuserdatad文件夹名字的问题...user.xcuserdatad文件夹的名字,不是当前用户的名字,就会显示n ...

  9. Entity Framework 更新带外键的实体为null

    using (var ctx = new PortalContext()){    var city = ctx.Cities.Find(42);    ctx.Entry(city)        ...

随机推荐

  1. Nacos安装与启动教程

    前言 Nacos是阿里巴巴集团开源的一个易于使用的平台,专为动态服务发现,配置和服务管理而设计,Nacos基本上支持现在所有类型的服务,例如,Dubbo / gRPC服务,Spring Cloud R ...

  2. javaAgent与pinpoint

    转载:https://www.cnblogs.com/kokov/p/12120033.html 项目中pinpoint应用:

  3. Mysql命令、常用函数

    一.sql命令行 查看数据库 show database : 选择使用的数据库 use 数据库名  : 查看表 show tables ; 查询表 select * from 表名     高版本my ...

  4. 05_Content Provider

    Content Provider是内容提供器,与内容(数据)的存取(存储.获取)有关,是Android应用程序的四大组成部分之一,是Android中的跨应用访问数据机制. 数据库在Android当中是 ...

  5. Asp.NetCore之AutoMapper基础篇

    应用场景 现在由于前后端技术的分离,后端程序员在使用ORM框架开发后台API接口的时候,往往会将数据库的"数据模型"直接提供给前端.而大多数时候,可能这些数据并不能够满足前端展示的 ...

  6. 一条 sql 的执行过程详解

    写操作执行过程 如果这条sql是写操作(insert.update.delete),那么大致的过程如下,其中引擎层是属于 InnoDB 存储引擎的,因为InnoDB 是默认的存储引擎,也是主流的,所以 ...

  7. SpringBoot打包成Docker镜像

    1. 本文环境 Maven:3.6.3(Maven配置参考) SpringBoot version:2.3.4.RELEASE Docker version: 19.03.11(Docker搭建参考) ...

  8. day3(axios封装)

    1. 始vue化项目 https://www.cnblogs.com/xiaonq/p/11027880.html vue init webpack deaxios     # 使用脚手架创建项目 d ...

  9. 使用PyQt进行Python图形界面程序开发文章目录

    ☞ ░ 前往老猿Python博文目录 ░ PyQt入门知识原来是作为老猿Python<Python基础教程目录>后的进阶学习章节存在,最近不少专栏作者提醒老猿整体的博文内容不错,但博文没有 ...

  10. mybatis批量修改数据

    xxxMapper.xml: <update id="updateSensorWarnings" parameterType="java.util.List&quo ...