EF对象状态

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()。

猜你喜欢

转载自blog.csdn.net/dust__/article/details/106268864
EF