扩展ApplicationUsers时,尝试访问属性时出现null错误

时间:2019-06-07 19:09:40

标签: asp.net asp.net-mvc

我正在尝试从Customer.cs类访问ApplicationUser.cs中的属性。我不断收到null错误。在运行应用程序并尝试显示所有用户之前,我没有任何错误。错误发生在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 个答案:

答案 0 :(得分:1)

当您从数据库中查询ApplicationUser对象时,需要包括子实体(在这种情况下为Customer)。

即:用于从数据库中查询单个Customer

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

或全部/多个:

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

不执行此操作,您将看到要注意的确切症状。数据库具有有效的数据和有效的外键关联,但是尽管在查询数据后具有有效的外键(在这种情况下为CustomerUserId,但您的复杂子对象为null。

空引用异常本身是上述问题的症状。 ApplicationUser不包含在查询的数据中,因此它保持为空,然后您尝试访问空对象上的属性,并导致空引用异常。

如果您包含用于在帖子中获取Customer的实际查询,那么我可以为您提供实际更新的查询,您需要在每个ApplicationUser上包含Customer对象对象。