Сценарии и проблемы
1) Про AsNoTracking, Attach и ошибку "The instance of entity type cannot be tracked because another instance with the same key value for {'key'} is already being tracked..."
Вводные:
Делаем следующую выборку из 2 таблиц
Entity1 -> LinkedEntity1
Entity2 -> LinkedEntity1
Где Entity1, Entity2 - две строки из таблицы Entity, а LinkedEntity1 - одна строка из связанной таблицы. (Обе сущности Entity[i] ссылаются на одну и ту же строку - LinkedEntity1)
При использовании Entity Framework Core была замечена следующая ситуация:
- Когда включен AsNoTracking
ReferenceEquals(Entity1.LinkedEntity, Entity2.LinkedEntity) - false
Т.е. фреймворк не только не отслеживает данные, но и не фиксирует повторяющиеся сущности из БД. Итого создано 2 экземпляра LinkedEntity. - Когда выключен AsNoTracking
ReferenceEquals(Entity1.LinkedEntity, Entity2.LinkedEntity) - true
Фреймворк обнаружил повторяющуюся сущность и создал только 1 экземпляр LinkedEntity.
Завершение:
В случае, если попытаться прикрепить полученный графы (Entity1 и Entity2) объектов к другому контексту, то можно получить ошибку из-за двух экземпляров LinkedEntity с одинаковым первичным ключом.
Поэтому необходимо сделать выборку с включенным трекингом, даже если мы не планируем менять данные в том-же контексте, а планируем присоединить их к другому.
2) Уровни изоляции и Табличные указания (Хинты)
Варианты на основе механизма Interception EF | Перехватчики.
Entity Framework with NOLOCK
https://stackoverflow.com/questions/926656/entity-framework-with-nolock
How to implement Select For Update in EF Core
https://stackoverflow.com/questions/37984312/how-to-implement-select-for-update-in-ef-core