C# Entity Framework查询小技巧 NoTracking
在使用Entity Framework做查询的时候,如果只需要显示,而不用保存实体,那么可以用AsNoTracking()来获取数据。
这样可以提高查询的性能。
代码如下:
var context = new Entities(connectStr); var contentlist = context.Set<Content>().AsQueryable().AsNoTracking();
但是如果取到数据后,要对数据做修改并保存,则无法反映到数据库里。
如:
var context = new Entities(connectStr); var contentlist = context.Set<Content>().AsQueryable().AsNoTracking(); var content = contentlist.Where(o => o.Id == 18).FirstOrDefault(); content.Id = 19; context.SaveChanges();
虽然修改后对数据库进行了Commit,再次读取后发现这条数据的Id还是18。
另外如果对通过AsNoTracking得到的数据做删除处理,则会报错。
如:
var context = new Entities(connectStr); var contentlist = context.Set<Content>().AsQueryable().AsNoTracking(); var content = contentlist.Where(o => o.Id == 18).FirstOrDefault(); context.Set<Content>().Remove(content); context.SaveChanges();
执行后会抛出System.InvalidOperationException异常,
原因是:オブジェクトは ObjectStateManager 内に見つからなかったため削除できません。
中文意思是:因为无法在ObjectStateManager中找到对象,所以无法删除。