我对.AsNoTracking()扩展名有疑问,因为这都是很新的,也很令人困惑。我正在为网站使用每个请求的上下文。我的许多实体都不会更改,因此不需要跟踪,但是在以下情况下,我不确定数据库的内容,甚至在这种情况下是否会有所不同。这个例子是我目前正在做的:context.Set<User>().AsNoTracking()// Step 1) Get usercontext.Set<User>()// Step 2) Update user与上面相同,但是.AsNoTracking()从步骤1中删除了:context.Set<User>();// Step 1) Get usercontext.Set<User>()// Step 2) Update user步骤1和步骤2使用相同的上下文,但发生在不同的时间。我无法解决的是是否有任何区别。由于第2步是更新,因此我猜两者都将两次访问数据库。谁能告诉我有什么区别?
3 回答
达令说
TA贡献1821条经验 获得超6个赞
参见本页实体框架和AsNoTracking
AsNoTracking会做什么
实体框架公开了许多性能调整选项,以帮助您优化应用程序的性能。这些调整选项之一是.AsNoTracking()。通过这种优化,您可以告诉您Entity Framework不要跟踪查询结果。这意味着Entity Framework不对查询返回的实体执行任何其他处理或存储。但是,这也意味着您必须先将这些实体重新附加到跟踪图上,才能更新它们。
使用AsNoTracking可以显着提高性能
守候你守候我
TA贡献1802条经验 获得超10个赞
没有跟踪LINQ到实体查询
当您的查询用于读取操作时,建议使用AsNoTracking()。在这些情况下,您可以取回您的实体,但是它们不会被您的上下文跟踪。这可以确保最少的内存使用和最佳性能
优点
与常规LINQ查询相比,性能得到了提高。
完全物化的对象。
使用编程语言内置的语法最简单地编写。
缺点
不适合CUD操作。
某些技术限制,例如:与Entity SQL中的简单OUTER JOIN语句相比,对OUTER JOIN查询使用DefaultIfEmpty的模式所导致的查询更为复杂。
您仍然不能将LIKE与常规模式匹配一起使用。
- 3 回答
- 0 关注
- 1590 浏览
添加回答
举报
0/150
提交
取消