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. flink:StreamGraph转换为JobGraph

    1 转换基本流程 2 简单来看可以分为两部分: 第一部分是通过一些util.translator.generator等类将职责进行解耦.托管和分离,期间涉及FlinkPipelineTranslati ...

  2. C语言讲义——变量(variable)

    变量(variable) 变量用于存放数据 变量是供程序操作的存储区的名字 变量有类型,该类型决定了变量占用内存的大小 字节→ C语言有以下6种简单变量类型: 类型细分: 变量在内存中需要占据空间,内 ...

  3. C语言基础知识:几种特殊的函数宏封装方式

    函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销. 函数宏本质上为宏,可以直接进行定义,例如: #define INT ...

  4. LeetCode 037 Sudoku Solver

    题目要求:Sudoku Solver Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells ...

  5. 欢天喜地七仙女——UML设计

    这个作业的要求在哪里 作业要求 团队名称 欢天喜地七仙女 团队成员 王玮晗.林鑫宇.黄龙骏.陈少龙.何一山.崔亚明.陆桂莺 这个作业的目标 团队一起绘制UML图 作业正文 如下 其它参考文献 见文末 ...

  6. oracle ddl 与 dml

    DDL create table 创建表 alter table 修改表 drop table 删除表 truncate table 删除表中所有行 create index 创建索引 drop in ...

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

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

  8. jwt介绍

    jwt原理 最简单理解:jwt本质就是, 把用户信息通过加密后生成的一个字符串 JWT的原则是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户 { "UserName" ...

  9. 基于gin的golang web开发:Gin技术拾遗

    本文是对前几篇文章的一些补充,主要包含两部分:单元测试和实际项目中使用路由的小问题. 拾遗1:单元测试 Golang单元测试要求代码文件以_test结尾,单元测试方法以Test开头,参数为*testi ...

  10. PyQt(Python+Qt)学习随笔:QTableWidget的构造方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget有2个构造方法: QTableWidget(QWidget parent = ...