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. python画猫并打包成EXE文件

    因python自带有海龟画图库,尝试给爱猫的小仙女来画个猫咪. 1.代码如下 from turtle import * #两个函数用于画心 def curvemove(): for i in rang ...

  2. exgcd 学习笔记

    最大公约数 更相减损术:\(\gcd(x,y)=\gcd(x,y-x)(x\leq y)\). 证明: 设 \(\gcd(x,y)=k\),则 \(x=kp,y=kq,\gcd(p,q)=1\). 那 ...

  3. MySQL查询练习2

    MySQL查询练习2 导读: 本次MySQL的查询语句是本人考试题目: 所有题目都已通过: 该查询练习并没有sql文件进行检查: 如果有书写以及其他错误欢迎指出. 题目正文: 1.找出借书超过5本的借 ...

  4. Android的Toolbar(含溢出菜单设置[弹出菜单的使用])的使用PopMenu的样式

    http://blog.csdn.net/yingtian648/article/details/52432438(转载) 1.在Toolbar.xml中设置弹出菜单的风格(app:popupThem ...

  5. 【2020.12.01提高组模拟】卡特兰数(catalan)

    题目 题目描述 今天,接触信息学不久的小\(A\)刚刚学习了卡特兰数. 卡特兰数的一个经典定义是,将\(n\)个数依次入栈,合法的出栈序列个数. 小\(A\)觉得这样的情况太平凡了.于是,他给出了\( ...

  6. 基于CefSharp开发(二)自定义浏览器窗体

    上一篇 https://www.cnblogs.com/mchao/p/13914726.html 简单了解了CefSharp引用配置但页面光秃秃的,这一篇着手开发简单浏览器窗体 一.Edge浏览器窗 ...

  7. PyQt(Python+Qt)学习随笔:Qt Designer中建立CommandLinkButton信号与Action的槽函数连接

    在Qt Designer中,通过F4进行信号和槽函数连接编辑时,接收信号的对象不能是Action对象,但在右侧的编辑界面,可以选择将一个界面对象的信号与Action对象的槽函数连接起来. 如图: 上图 ...

  8. v-lazyload数据变化图片不切换

    这个问题让我很困惑,明明得到的商品数据已经改变了,但是就图片不变化,随后找到了解决办法,那就是多加一个动态的key <img v-lazy="item.productImage&quo ...

  9. 题解-CF677D Vanya and Treasure

    CF677D Vanya and Treasure 有一个 \(n\times m\) 的矩阵 \(a(1\le a_{i,j}\le p)\),求从起点 \((1,1)\) 出发依次遍历值为 \(1 ...

  10. 题解-比赛CF1332

    题解-比赛CF1332 比赛CF1332 [A] [B] [C] [D] [E] [F] [G] [A]Exercising Walk Exercising Walk \(T\) 组测试数据,每次给定 ...