Как получить SelectList для текущего пользователя - PullRequest
1 голос
/ 09 октября 2019

Я пытаюсь получить список клиентов / товаров / категорий из базы данных. В списке выбора будет отображаться только список клиентов / товаров / категорий текущего пользователя / текущего пользователя, вошедшего в систему.

Но я получаю только первый элемент, принадлежащий текущему зарегистрированному пользователю.

В базе данных каждого пользователя есть applicationUserId

. Я должен получить весь список клиентов / категорий / товаров текущего пользователя в списке выбора

 public IActionResult Create()
        {
            var currentUser = _userManager.GetUserAsync(HttpContext.User);

            ViewData["CustomerId"] = new SelectList(_context.Customers.Where(c => c.ID == currentUser.Id), "ID", "Name") ;


            ViewData["ProductId"] = new SelectList(_context.Products.Where(p => p.ProductId == currentUser.Id), "ProductId", "ProductName");


            ViewData["CategoryId"] = new SelectList(_context.Categories.Where(p =>p.CategoryId == currentUser.Id) , "CategoryId", "CategoryName");

            return View();
        }

Обновленный код

 public IActionResult Create()
        {
            var currentUser = _userManager.GetUserAsync(HttpContext.User);

            string userId = currentUser.Id.ToString();
            ViewData["CustomerId"] = new SelectList(_context.Customers.Where(c => c.ApplicationUserId == userId), "ID", "Name");

            ViewData["ProductId"] = new SelectList(_context.Categories.Where(p => p.ApplicationUserId == userId), "ProductId", "ProductName");

            ViewData["ProductId"] = new SelectList(_context.Products.Where(p => p.ApplicationUserId == userId), "ProductId", "ProductName");

            return View();
        }

после обновления кода я получил

InvalidOperationException: A second operation started on this context before a previous operation completed. This is usually caused by different threads using the same instance of DbContext, however instance members are not guaranteed to be thread safe. This could also be caused by a nested query being evaluated on the client, if this is the case rewrite the query avoiding nested invocations.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Проблема в том, что вы не ожидаете первого запроса, поэтому последующие запросы выполняются до того, как первый будет завершен. Другими словами, вам нужно добавить ключевое слово await.

var currentUser = await _userManager.GetUserAsync(HttpContext.User);

Однако, поскольку все, что вам нужно, это идентификатор пользователя, для этого не обязательно идти в базу данных. Просто сделай:

var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
0 голосов
/ 09 октября 2019

Спасибо, два предложения от @serdar и @ chris-pratt помогли мне исправить мой код.

Позже я вышел с

  public async Task<IActionResult> Create()
        {
            var currentUser = await _userManager.GetUserAsync(HttpContext.User);

            string userId = currentUser.Id.ToString();
            ViewData["CustomerId"] = new SelectList(_context.Customers.Where(c => c.ApplicationUserId == userId), "ID", "Name");

            ViewData["CategoryId"] = new SelectList(_context.Categories.Where(p => p.ApplicationUserId == userId), "CategoryId", "CategoryName");

            ViewData["ProductId"] = new SelectList(_context.Products.Where(p => p.ApplicationUserId == userId), "ProductId", "ProductName");



            return View();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...