У меня есть вопрос, касающийся .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 является обновлением, я полагаю, что оба все равно дважды попадут в базу данных.
Может кто-нибудь сказать мне, в чем разница?
источник
смотрите эту страницу Entity Framework и AsNoTracking
Что делает AsNoTracking
Entity Framework предоставляет ряд параметров настройки производительности, которые помогут вам оптимизировать производительность ваших приложений. Один из этих вариантов настройки есть
.AsNoTracking()
. Эта оптимизация позволяет вамEntity Framework
не отслеживать результаты запроса. Это означает, что неEntity Framework
выполняется дополнительная обработка или хранение объектов, возвращаемых запросом. Однако это также означает, что вы не можете обновить эти объекты, не подключив их к графику отслеживания.при использовании AsNoTracking можно добиться значительного прироста производительности
источник
Нет отслеживания запросов LINQ to Entities
Использование AsNoTracking () рекомендуется, когда ваш запрос предназначен для операций чтения. В этих сценариях вы возвращаете свои объекты, но они не отслеживаются вашим контекстом. Это обеспечивает минимальное использование памяти и оптимальную производительность
Более подробная информация доступна здесь:
Вопросы производительности для Entity Framework
Entity Framework и NoTracking
источник
Отключение отслеживания также приведет к тому, что ваши результирующие наборы будут передаваться в память. Это более эффективно, когда вы работаете с большими наборами данных и вам не нужен весь набор данных одновременно.
Ссылки:
источник
AsNoTracking () позволяет обойти требование «уникальный ключ на запись» в EF (явно не упоминается в других ответах).
Это чрезвычайно полезно при чтении представления, которое не поддерживает уникальный ключ, потому что, возможно, некоторые поля могут быть обнуляемыми или природа представления не является логически индексируемой.
Для этих случаев «ключ» может быть установлен для любого необнуляемого столбца, но тогда AsNoTracking () должен использоваться с каждым запросом, иначе записи (дублирующиеся по ключу) будут пропущены.
источник
Если у вас есть что-то еще, изменяющее БД (скажем, другой процесс), и вам нужно убедиться, что вы видите эти изменения, используйте
AsNoTracking()
, в противном случае EF может дать вам последнюю копию, которая была у вашего контекста, следовательно, было бы хорошо использовать новый контекст каждый запрос :http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/
источник