EF对象状态
为什么查询出来的对象Remove()、再SaveChanges()就会把数据删除。而自己new一个Person()对象,然后Remove()不行?为什么查询出来的对象修改属性值后、再SaveChanges()就会把数据库中的数据修改。
因为EF会跟踪对象状态的改变。
EF中中对象有五个状态:Detached(游离态,脱离态)、Unchanged(未改变)、Added(新增)、Deleted(删除)、Modified(被修改)。
Add()、Remove()修改对象的状态。所有状态之间几乎都可以通过:Entry§.State=xxx的方式进行强制状态转换。
状态改变都是依赖于Id的(Added除外)
EF优化的一个技巧
如果查询出来的对象只是供显示使用,不会修改、删除后保存,那么可以使用AsNoTracking()来使得查询出来的对象是Detached状态,这样对对象的修改也还是Detached状态,EF不再跟踪这个对象状态的改变,能够提升性能。
var p1 = context.Students.Where(p => p.Name == "张三").FirstOrDefault();
改成:
var p1 = context.Students.AsNoTracking().(p => p.Name == "张三").FirstOrDefault();
Console.WriteLine(context.Entry(p1).State);
因为AsNoTracking()是DbQuery类(DbSet的父类)的方法,所以要先在DbSet后调用AsNoTracking()。