EFCore (二)之 跟踪实体
核心
SaveChanges()
“已分离”和“未改变”的实体,SaveChanges()忽略;
“已添加”的实体,SaveChanges() 插入数据库;
“已修改”的实体,SaveChanges() 更新到数据库;
“已删除”的实体,SaveChanges() 从数据库删除
快照更改跟踪
这是EFCore 默认的一个机制
首次跟踪一个实体的时候,EFCore 会创建这个实体的快照。在执行SaverChanges()等方法的时候,EFCore会把存储的快照中的值于实体的当前值进行比较
实体跟踪的小技巧
个人不推荐使用
一般我们执行修改某个对象的时候,EFCore的操作是先查询出来这个对象,然后对某个值进行修改 最后调用SaveChanges()
例如:
var item = dbContext.Test.Single(r=> r.Id == 1);
item.Name = "新值"
dbContext.SaveChanges()
生成一条SQL 如下
Test item = new Test{id=1,Name="new"}
var entry = dbContext.Entry(item);
entry.Property("Name").IsModified = true;
dbContext.SaveChanges()
先查在改,最终会生成两个Sql语句:一个是 Select Id为 1;然后会生成一个Update 语句 去修改这个Id 为 1 的行
后面这个使用跟踪实体 改为 Modified Name 字段,最终生成只会标识Modified 为修改跟踪