1. public override int SaveChanges()
  2. {
  3. var changedEntities = ChangeTracker.Entries().Where(e => e.State == EntityState.Added || e.State == EntityState.Modified).ToList();
  4. var now = DateTime.Now;
  5. changedEntities.ForEach(e =>
  6. {
  7. if (e.State == EntityState.Added)
  8. {
  9. var createTimeProperty = e.Entity.GetType().GetProperty("CreateTime");
  10. var createUserIdProperty = e.Entity.GetType().GetProperty("CreateUserId");
  11. var createUserNameProperty = e.Entity.GetType().GetProperty("CreateUserName");
  12.  
  13. if (createTimeProperty != null)
  14. {
  15. createTimeProperty.SetValue(e.Entity, now);
  16. }
  17. if (createUserIdProperty != null)
  18. {
  19. createUserIdProperty.SetValue(e.Entity, InternalContext.UserId);
  20. }
  21. if (createUserNameProperty != null)
  22. {
  23. createUserNameProperty.SetValue(e.Entity, InternalContext.UserName);
  24. }
  25.  
  26. var updateTimeProperty = e.Entity.GetType().GetProperty("UpdateTime");
  27. var updateUserIdProperty = e.Entity.GetType().GetProperty("UpdateUserId");
  28. var updateUserNameProperty = e.Entity.GetType().GetProperty("UpdateUserName");
  29.  
  30. if (updateTimeProperty != null)
  31. {
  32. updateTimeProperty.SetValue(e.Entity, now);
  33. }
  34. if (updateUserIdProperty != null)
  35. {
  36. updateUserIdProperty.SetValue(e.Entity, InternalContext.UserId);
  37. }
  38. if (updateUserNameProperty != null)
  39. {
  40. updateUserNameProperty.SetValue(e.Entity, InternalContext.UserName);
  41. }
  42. }
  43. else if (e.State == EntityState.Modified)
  44. {
  45. var isDeleteProperty = e.Entity.GetType().GetProperty("IsDelete");
  46. if (isDeleteProperty != null && (bool)isDeleteProperty.GetValue(e.Entity))
  47. {
  48. var deleteTimeProperty = e.Entity.GetType().GetProperty("DeleteTime");
  49. var deleteUserIdProperty = e.Entity.GetType().GetProperty("DeleteUserId");
  50. var deleteUserNameProperty = e.Entity.GetType().GetProperty("DeleteUserName");
  51.  
  52. if (deleteTimeProperty != null)
  53. {
  54. deleteTimeProperty.SetValue(e.Entity, now);
  55. }
  56. if (deleteUserIdProperty != null)
  57. {
  58. deleteUserIdProperty.SetValue(e.Entity, InternalContext.UserId);
  59. }
  60. if (deleteUserNameProperty != null)
  61. {
  62. deleteUserNameProperty.SetValue(e.Entity, InternalContext.UserName);
  63. }
  64. }
  65. else
  66. {
  67. var updateTimeProperty = e.Entity.GetType().GetProperty("UpdateTime");
  68. var updateUserIdProperty = e.Entity.GetType().GetProperty("UpdateUserId");
  69. var updateUserNameProperty = e.Entity.GetType().GetProperty("UpdateUserName");
  70.  
  71. if (updateTimeProperty != null)
  72. {
  73. updateTimeProperty.SetValue(e.Entity, now);
  74. }
  75. if (updateUserIdProperty != null)
  76. {
  77. updateUserIdProperty.SetValue(e.Entity, InternalContext.UserId);
  78. }
  79. if (updateUserNameProperty != null)
  80. {
  81. updateUserNameProperty.SetValue(e.Entity, InternalContext.UserName);
  82. }
  83. }
  84. }
  85. });
  86.  
  87. return base.SaveChanges();
  88. }

先看以上代码,我们封装了一个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. P3619 魔法

    考虑两个任务 \(1\) 和 \(2\),当前时间为 \(T\),两个任务都要完成. 先完成任务 \(1\) 的条件是 \(T>t_1\) 且 \(T+b_1>t_2\),先完成任务 \( ...

  2. JavaSE 学习笔记05丨泛型、集合

    Chapter. 10 泛型 10.1 泛型程序设计 泛型,指可以在类或方法中预支地使用未知的类型.泛型程序设计(Generic programming),意味着编写的代码可被很多不同类型的对象所重用 ...

  3. otter搭建

    转载: https://blog.csdn.net/inthat/article/details/93595156 https://www.cnblogs.com/Inspire-Yi/p/80943 ...

  4. 帆软用工具测试超链接打开弹窗(iframe嵌套),解决js传参带中文传递有乱码问题

    1.新建超链接 随意点击一个单元格右击,选择 超级链接 2.在弹出的窗口中选择JavaScript脚本 如图: 其中红框框出的是几个要点   ,左边的就不讲了,右上角的参数cc是设置了公式remote ...

  5. chrome浏览器查看当前页面cookie

    方法一:点进去设置--高级--网站设置--权限cookie--查找所有cookie和网站数据,就可以看到所有的cookie信息了,举例: 方法二:键盘F12,找到network--点击Doc(如果没有 ...

  6. Django之数据库--ORM

    一.建立数据库模型类 1.在model里创建模型类.(继承models.Model) from django.db import models # Create your models here. c ...

  7. springsecurity+springsocial资料收集

    https://blog.csdn.net/tryandfight/article/details/80524573 https://niocoder.com/2018/01/09/Spring-Se ...

  8. 老猿学5G:融合计费场景的Nchf_ConvergedCharging_Create、Update和Release融合计费消息交互过程

    ☞ ░ 前往老猿Python博文目录 ░ 一.Nchf_ConvergedCharging_Create交互过程 Nchf_ConvergedCharging_Create 服务为CTF向CHF请求提 ...

  9. 第7.11节 案例详解:Python类实例变量

    上节老猿介绍了实例变量的访问方法,本节结合一个具体案例详细介绍实例变量访问. 本节定义一个Vehicle类(车),它有三个实例变量self.wheelcount(轮子数).self.power(动力) ...

  10. PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件的currentWidget和widget方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTabWidget的每个选项卡都有一个对应的页面部件对象,可用通过currentWidget方法和 ...