В документации для AsNoTracking () в Entity Framework Core говорится, что любые изменения в нем не будут сохраняться при сохранении контекста базы данных. Я заметил еще одно отличие при использовании AsNoTracking (), а именно: если в контексте базы данных есть несохраненные изменения и вы запрашиваете его с помощью AsNoTracking (), эти изменения не будут возвращены. В документации создается впечатление, что только изменения, внесенные в запрос AsNoTracking (), не будут отслеживаться и сохраняться при сохранении, но кажется, что возвращаемое содержимое также будет другим.
Если это действительно предполагаемое поведение , Я не уверен в лучшем шаблоне проектирования. Я использовал AsNoTracking () во всех моих запросах только для чтения, но это означает, что у меня есть ошибка, поскольку мой дизайн выглядит примерно так:
Конечная точка контроллера, которая изменяет данные:
- Вызвать что-то в службе, которая может или не может изменить db
- Вызвать что-нибудь еще в службе, которая выполняет запрос только для чтения с AsNoTracking ()
- Контроллер сохраняет контекст базы данных
Предполагается, что любая конечная точка контроллера может вызывать любое количество сервисных методов, которые могут или не могут изменять базу данных, контексты базы данных ограничены, поэтому они разделяются между вызовами, и в конечном итоге контроллер сохраняет изменения . Проблема в том, что №2 из приведенного выше не вернет изменений, сделанных в №1. Как это решить? Службы могут вызывать другие службы, которые могут получать некоторые данные из мест, которые уже были изменены, поэтому я не могу просто передавать модели повсюду. Должен ли я просто удалить AsNoTracking () отовсюду и покончить с этим? Или мне следует добавлять вызов сохранения после каждой записи? Или есть еще что-нибудь, что я могу сделать?
TL; DR: я хочу, чтобы AsNoTracking () использовался в запросах только для чтения для повышения скорости, но он не вернет никаких несохраненных изменений. Следует ли мне удалять AsNoTracking (), сохранять после каждого редактирования или есть лучший способ?
Изменить: вот отрывок того, что я имею в виду; любой запрос с AsNoTracking () игнорирует любые изменения, внесенные в контекст до его сохранения, что заставляет меня задаться вопросом, как AsNoTracking () может быть вообще тогда полезен:
var userSessionEntry = await this.mainContext.Sessions
.Where(t => t.AccountId == session.AccountId).FirstAsync();
userSessionEntry.AccountId = Guid.Empty;
var userSessionEntry2 = await this.mainContext.Sessions
.Where(t => t.AccountId == session.AccountId).AsNoTracking().FirstAsync();
Console.WriteLine(userSessionEntry2.AccountId); // prints original AccountId and not an empty id
Редактировать 2: Я использую последнюю версию предварительная версия Entity Framework Core; 5.0.0-preview.5.20278.
Спасибо.