.AsNoTracking()有什么区别?

我对.AsNoTracking()扩展名有疑问,因为这都是很新的,也很令人困惑。


我正在为网站使用每个请求的上下文。


我的许多实体都不会更改,因此不需要跟踪,但是在以下情况下,我不确定数据库的内容,甚至在这种情况下是否会有所不同。


这个例子是我目前正在做的:


context.Set<User>().AsNoTracking()

// Step 1) Get user

context.Set<User>()

// Step 2) Update user

与上面相同,但是.AsNoTracking()从步骤1中删除了:


context.Set<User>();

// Step 1) Get user

context.Set<User>()

// Step 2) Update user

步骤1和步骤2使用相同的上下文,但发生在不同的时间。我无法解决的是是否有任何区别。由于第2步是更新,因此我猜两者都将两次访问数据库。


谁能告诉我有什么区别?


九州编程
浏览 1489回答 3
3回答

达令说

参见本页实体框架和AsNoTrackingAsNoTracking会做什么实体框架公开了许多性能调整选项,以帮助您优化应用程序的性能。这些调整选项之一是.AsNoTracking()。通过这种优化,您可以告诉您Entity Framework不要跟踪查询结果。这意味着Entity Framework不对查询返回的实体执行任何其他处理或存储。但是,这也意味着您必须先将这些实体重新附加到跟踪图上,才能更新它们。使用AsNoTracking可以显着提高性能

守候你守候我

没有跟踪LINQ到实体查询当您的查询用于读取操作时,建议使用AsNoTracking()。在这些情况下,您可以取回您的实体,但是它们不会被您的上下文跟踪。这可以确保最少的内存使用和最佳性能优点与常规LINQ查询相比,性能得到了提高。完全物化的对象。使用编程语言内置的语法最简单地编写。缺点不适合CUD操作。某些技术限制,例如:与Entity SQL中的简单OUTER JOIN语句相比,对OUTER JOIN查询使用DefaultIfEmpty的模式所导致的查询更为复杂。您仍然不能将LIKE与常规模式匹配一起使用。
打开App,查看更多内容
随时随地看视频慕课网APP