При расширении ApplicationUsers я получаю нулевую ошибку при попытке доступа к свойствам - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь получить доступ к свойствам в ApplicationUser.cs из класса Customer.cs. Я продолжаю получать нулевую ошибку. Я не получаю ошибок до тех пор, пока не запускаю приложение и не пытаюсь отобразить всех пользователей. Ошибка происходит на ApplicationUser.BusinessName

Customer.cs

public class Customer
{
    [Key, ForeignKey("ApplicationUser")]
    public string CustomerUserId { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
    public string BizName
    {
        get
        {
            return ApplicationUser.BusinessName;
        }

    }
 }

ApplicationUser.cs

 public class ApplicationUser : IdentityUser
{
    public virtual Customer Customer { get; set; }
    [Display(Name = "Organization")]
    public string BusinessName { get; set; }
    ....
 }

NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Контроллер AdminUsers

     public class AdminUsersController : Controller
         {
            private readonly UserManager<ApplicationUser> _userManager;
            private readonly RoleManager<ApplicationRole> _roleManager;
            private readonly ApplicationDbContext _db;

     public AdminUsersController(ApplicationDbContext db, RoleManager<ApplicationRole> roleManger, UserManager<ApplicationUser> userManager)
         {
        _userManager = userManager;
        _roleManager = roleManger;
        _db = db;
    }
  public async Task<IActionResult> Index Customer customer)
      {
          var users = from u in _userManager.Users.Include(u => u.Orders).Include(u => u.UserRoles).ThenInclude(ur => ur.Role) select u;

          return  View( users.Include(u => u.Customer).Include(u => u.Orders).ToPagedList(pageNumber, pageSize));

       }

1 Ответ

1 голос
/ 07 июня 2019

Вам необходимо включить дочерние объекты (в данном случае ApplicationUser s), когда вы запрашиваете свой объект Customer из базы данных.

Т.е.: для запроса одного Customer из БД:

_context.Customers.Include(x => x.ApplicationUser).Single(y => y.Id == myCustomerId)

или для всех / нескольких:

_context.Customers.Include(x => x.ApplicationUser).ToList();

Без этого вы увидите точные симптомы, которые вы заметили. БД имеет действительные данные и допустимые ассоциации внешнего ключа, однако ваш сложный дочерний объект имеет нулевое значение, несмотря на наличие действительного внешнего ключа (в данном случае CustomerUserId) после запроса данных.

Само исключение нулевой ссылки является признаком вышеуказанной проблемы. ApplicationUser не включен в запрашиваемые данные, поэтому он остается нулевым, затем вы пытаетесь получить доступ к свойству нулевого объекта, что приводит к исключению нулевой ссылки.

Если вы включите свой фактический запрос для получения Customer s в своем сообщении, то я могу предоставить вам актуальный обновленный запрос, который вам необходим для включения объекта ApplicationUser в каждый Customer объект.

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