Я работаю со стандартной программой ASP.NET Core 2.1, и я рассматривал проблему, заключающуюся в том, что для многих моих методов контроллера требуется извлечение текущего зарегистрированного пользователя.
Iзаметил, что основной идентификационный код asp.net использует DBSet для хранения сущностей и что последующие обращения к нему должны выполнять чтение из локальных сущностей в памяти и не затрагивать БД, но, похоже, каждый раз, когда мой код требует чтения из БД(Я знаю, что я запускаю SQL Profiler и вижу, что запросы на выборку для AspNetUsers выполняются с использованием Id в качестве ключа)
Я знаю, что существует очень много способов настроить Identity, и он меняется в зависимости от версий, которые могут бытьЯ что-то не так делаю, или здесь есть фундаментальная проблема, которую можно решить.
Я установил хранилища EF и удостоверений по умолчанию в файле startup.cs ConfigureServices:
services.AddDbContext<MyDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MyDBContext")));
services.AddIdentity<CustomIdentity, Models.Role>().AddDefaultTokenProviders().AddEntityFrameworkStores<MyDBContext>();
и прочитать пользователя в каждом методе контроллера:
var user = await _userManager.GetUserAsync(HttpContext.User);
в коде идентификации, кажется, что этот метод вызывает UserStore FindByIdAsync
метод, который вызывает FindAsync
в DBSet пользователей.в документе о производительности EF говорится:
It’s important to note that two different ObjectContext instances will have two different ObjectStateManager instances, meaning that they have separate object caches.
Итак, что здесь может пойти не так, какие-либо предположения, почему вызовы EF в ASP.NET Core в Userstore не используют локальный DBSet сущностей?Или я ошибаюсь - и каждый раз, когда вызывается контроллер, создается новый контекст EF?