Хобрук: Ваш путь к мастерству в программировании

.Net Core получает объекты ApplicationUser

Я добавил несколько конкретных свойств в ApplicationUser стандартного проекта. некоторые из добавленных свойств относятся к пользовательским классам. Поскольку я использую EntityFramework, он создает базу данных для пользователей и по одной для каждого пользовательского класса. я добавил свойства в свой ManageController и Views и добавил эти свойства в конкретные работы dbtable, но я не могу получить к ним доступ. в dbo.AspNetUsers добавлен столбец, который вызывается после атрибута + ID (в моем примере "NameID").

Теперь, если я загружаю пользователя в свой ManageController, загружаются все обычные атрибуты, но пользовательские имеют значение null.

Мой вопрос: как я могу загрузить пользовательские объекты (которые действительно хранятся в другой таблице).

ApplicationUser.cs:

namespace refProject.Models
{
    public class ApplicationUser : IdentityUser
    {
        public Name Name { get; set; }
    }
}

Манажеконтроллер.cs

//other usings
using refProject.Models;
using refProject.Models.ManageViewModels;

namespace refProject.Controllers
{
    [Authorize]
    public class ManageController : Controller
    {
        private readonly UserManager<ApplicationUser> _userManager;
        //other managers

        public ManageController(
          UserManager<ApplicationUser> userManager,
          //other managers
          )
        {
            _userManager = userManager;
            //other managers
        }

        //
        // GET: /Manage/Index
        [HttpGet]
        public async Task<IActionResult> Index(ManageMessageId? message = null)
        {
            ViewData["StatusMessage"] =
                message == ManageMessageId.ChangeNameSuccess ? "Your name has been changed."
                : message == ManageMessageId.SetNameSuccess ? "Your name has been set."
                : "";

            var user = await GetCurrentUserAsync();
            if (user == null)
            {
                return View("Error");
            }
            var model = new IndexViewModel
            {
                //other Properties
                //
                //
                // THIS ONE IS NULL
                //
                //        
                Name = user.Name
                //other Properties
            };
            return View(model);
        }

        // GET: /Manage/ChangeName
        [HttpGet]
        public IActionResult ChangeName()
        {
            return View();
        }

        //
        // POST: /Manage/ChangeName
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> ChangeName(ChangeNameViewModel model)
        {
            if(!ModelState.IsValid)
            {
                return View(model);
            }
            var user = await GetCurrentUserAsync();
            if(user != null)
            {
                Name NewName = new Name();
                NewName.FirstName = model.NewFirstName;
                NewName.LastName = model.NewLastName;

                user.Name = NewName;

                IdentityResult result = await _userManager.UpdateAsync(user);
                if (result.Succeeded)
                {
                    return RedirectToAction(nameof(Index), new { Message = ManageMessageId.ChangeNameSuccess });
                }
                AddErrors(result);
                return View(model);
            }
            return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error });
        }

        //
        // GET: /Manage/SetName
        [HttpGet]
        public IActionResult SetName()
        {
            return View();
        }

        //
        // POST: /Manage/SetName
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> SetName(SetNameViewModel model)
        {
            if(!ModelState.IsValid)
            {
                return View(model);
            }

            var user = await GetCurrentUserAsync();
            if(user != null)
            {
                Name NewName = new Name();
                NewName.FirstName = model.NewFirstName;
                NewName.LastName = model.NewLastName;

                user.Name = NewName;

                IdentityResult result = await _userManager.UpdateAsync(user);
                if(result.Succeeded)
                {
                    return RedirectToAction(nameof(Index), new { Message = ManageMessageId.SetNameSuccess });
                }
                AddErrors(result);
                return View(model);
            }
            return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error });
        }

        #region Helpers

        private void AddErrors(IdentityResult result)
        {
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
        }

        public enum ManageMessageId
        {
            Error,
            ChangeNameSuccess,
            SetNameSuccess,
        }

        private Task<ApplicationUser> GetCurrentUserAsync()
        {
            return _userManager.GetUserAsync(HttpContext.User);
        }

        #endregion
    }
}

Имя.cs

namespace refProject.Models
{
    public class Name
    {
        public int ID { get; set; }
        public string fTitle { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string lTitle { get; set; }

        public override string ToString()
        {
            return fTitle + " " + FirstName + " " + LastName + " " + lTitle;
        }
    }
}

  • Вы используете нестандартные термины. Атрибуты = Свойства?! 29.06.2017

Ответы:


1

Это известная проблема. Это не считается ошибкой, а скорее проектным решением.

Рекомендуемый способ — получить доступ к пользователю через DbContext, а не из реализации UserManager.

«Просто добавим немного больше деталей: в качестве оптимизации производительности ASP.NET Core Identity в настоящее время загружает только сущности, связанные с пользователем или ролью, по мере необходимости для удовлетворения вызовов API. -in) жадно при вызове метода, такого как FindByName(), потому что методы поиска требуются только для возврата корня.

На данный момент отправка запросов к DbContext является рекомендуемым способом загрузки связанных данных. Если вы хотите абстрагироваться от кода приложения, вы можете расширить как хранилище идентификаторов, так и классы менеджера, чтобы добавить методы для извлечения и возврата ваших пользовательских связанных данных».

ссылка на комментарий

Вы можете изменить свой метод GetCurrentUserAsync следующим образом:

private ApplicationUser GetCurrentUserAsync()
{
    return _userManager.Users.Include(x => x.Name).FirstOrDefault(x => x.Id == _userManager.GetUserId(User));
}
29.06.2017
Новые материалы

React on Rails
Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

Ториго  — революция в игре Го
Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

Математика и интуиция - Часть 1
У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..

Раскрытие возможностей НЛП: часть речевой маркировки и ее проблемы
В сфере обработки естественного языка (NLP) маркировка частей речи (POS) выступает в качестве фундаментального метода, позволяющего компьютерам понимать и анализировать человеческий язык на..

Под поверхностью: раскрытие деталей системы с помощью инструментов Linux CLI
Чем больше вы изучаете Linux и продвигаетесь вперед, тем больше вам нужно проверять информацию о вашей системе. Эта информация может касаться аппаратного обеспечения, такого как процессор,..