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. css万能清除原理

    如果现在能有清理浮动的办法,但不至于在文档中多一个没有用的空标记,这时的效果是最好的!引入:after伪元素选择器,可以在指定的元素的内容添加最后一个子元素 .container:after{ } 如 ...

  2. MarkDown使用之LaTeX表示数学公式

    对于文本排版格式,对于\(Microsoft\,Word\)来说,功能尽全,可调的参数十分多,人们可能会将不少的时间放在具体的文字大小.实现样式.而\(markdown\)语法能够让人们通过符号去替代 ...

  3. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  4. CentOS下搭建VNC/TEAMVIEW/SSH无密码登录

    VNC 配置桌面 # 安装gnome桌面环境 yum groupinstall Desktop -y # 安装中文语言支持包(可选) yum groupinstall 'Chinese Support ...

  5. 软件工程与UML第一次作业

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/ 这个作业要求在哪里 https://edu.cnblogs.com/campus/f ...

  6. 『CDN』让你的网站访问起来更加柔顺丝滑

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  7. Springboot核心注解

    运行文中的代码需要在项目构建中引入springboot 相关依赖. ① @configuration configuration,用来将bean加入到ioc容器.代替传统xml中的bean配置.代码示 ...

  8. 大白话详解大数据HBase核心知识点,老刘真的很用心(3)

    老刘目前为明年校招而努力,写文章主要是想用大白话把自己复习的大数据知识点详细解释出来,拒绝资料上的生搬硬套,做到有自己的理解! 01 HBase知识点(3) 第13点:HBase表的热点问题 什么是热 ...

  9. 第5.4节 Python函数中的变量及作用域

    一.函数中的变量使用规则 函数执行时,使用的全局空间是调用方的全局空间,参数及函数使用的局部变量存储在函数单独的局部名字空间内: 函数的形参在函数中修改了值时,并不影响调用方本身的数据,但如果形参是一 ...

  10. 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析

    一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...