这天小白又去面试了,回来告诉笔者面试问题都回答还不错,不过有个问题搞不懂,EF Core怎么还有个实体跟踪,还可以优化,一问这个当时就懵了。那么什么是EF Core的实体跟踪呢?这篇文章就替小白来回答一下。.
什么是EF Core实体追踪
EF Core在数据库查询/修改/更新数据时,EF 上下文就会创建实体快照,对实体进行追踪。如果是修改或更新,当遇到savechangs时就会检测实体的更改,然后持久化到数据库。这是EF Core追踪实体的属性是否有改变的一种机制。
EF Core实体追踪可以优化吗?
当我们只需要查询出实体而不需要修改时,实体追踪就没有任何用途了(需要深究)。这时可以调用 AsNoTracking 获取非追踪的数据,这样可以提高查询性能。代码如下:
var rel= teamContext.Teams.AsNoTracking().ToList();
//teamContext是上下文,Teams是实体表
也可以全局设置上下文禁用和开启实体追踪。
//置当前teamContext上下文查询不跟踪状态
teamContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
//置当前teamContext上下文查询跟踪状态
teamContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll;
扩展知识
状态 | 说明 |
Detached | 一切实体操作都是无效的 |
Unchanged | 有关系,没有任何操作 |
Deleted | 有关系,已经发出了删除的指令 |
Modified | 有关系,已经发出了修改的指令 |
Added | 有关系,已经发出了新增的指令 |
我们可以根据EntityEntry类的State属性查询实体的当前状态。例如:
Team team=new Team{Name="张山"};//
var state= teamContext.Entry(team).State;//Detached
teamContext.Add(team);
state = teamContext.Entry(team).State;//Added
teamContext.SaveChanges();
state = teamContext.Entry(team).State;//Unchanged
Team team2 = new Team {Id=3, Name = "李四" };
var stateup = teamContext.Entry(team2);
stateup.Property("Name").IsModified = true;
teamContext.SaveChanges();

本文讲述了EF Core的实体追踪(也有叫实体跟踪),在面试的时候当问到EF Core优化的时候可以举例。希望本文对大家有所收获,同时欢迎大家留言讨论本文。