2015-10-05 6 views
0

Я расширяю класс ApplicationUser с дополнительной информацией и отношениями, которые мне нужно использовать в моем приложении.Почему я получаю NullReferenceException

Вот мой ApplicationUser класс:

public class ApplicationUser : IdentityUser 
{ 
    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 

    [Display(Name = "Last Name")] 
    public string LastName { get; set; } 

    [Display(Name = "Full Name")] 
    public string FullName 
    { 
     get 
     { 
      return FirstName + " " + LastName; 
     } 
    } 

    [Display(Name = "Job Title")] 
    public string JobTitle { get; set; } 

    public virtual ICollection<Permission> Permissions { get; set; } 

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    { 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     // Add custom user claims here 
     userIdentity.AddClaim(new Claim("FullName", this.FullName)); 

     return userIdentity; 
    } 
} 

Моя Permission модель:

public class Permission : BaseEntity 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 

    // Many to One 
    public virtual ICollection<ApplicationUser> Users { get; set; } 
} 

И мой Create() метод в моем UsersController:

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Create(CreateUserViewModel model) 
{ 
    var selectedPermissions = model.Permissions.Where(x => x.IsChecked).Select(x => x.ID).ToList(); 

    if (ModelState.IsValid) 
    { 
     var user = new ApplicationUser { 
      UserName = model.Email, 
      Email = model.Email, 
      PrivateEmail = model.PrivateEmail, 
      FirstName = model.FirstName, 
      LastName = model.LastName, 
      JobTitle = model.JobTitle 
     }; 


     var result = await UserManager.CreateAsync(user, model.Password); 
     if (result.Succeeded) 
     { 
      // Remove all existing Roles 
      var userRoles = await UserManager.GetRolesAsync(user.Id); 
      var uRoles = String.Join(", ", userRoles.ToArray()); 
      await UserManager.RemoveFromRolesAsync(user.Id, uRoles); 

      // Add selected Role 
      await UserManager.AddToRoleAsync(user.Id, model.Role); 

      foreach (var permissionID in selectedPermissions) 
      { 
       var permission = await db.Permissions.FindAsync(permissionID); 
       if (permission != null) 
       { 
        user.Permissions.Add(permission); 
       } 
      } 
      await UserManager.UpdateAsync(user); 

      return RedirectToAction("Index", "Default"); 
     } 
     AddErrors(result); 
    } 

    // If we got this far, something failed, redisplay form 
    var allPermissions = await db.Permissions.ToListAsync(); // returns List<Permission> 
    var checkBoxListItems = new List<CheckBoxListItem>(); 
    foreach (var permission in allPermissions) 
    { 
     checkBoxListItems.Add(new CheckBoxListItem() 
     { 
      ID = permission.ID, 
      Display = permission.Name, 
      IsChecked = selectedPermissions.Contains(permission.ID) 
     }); 
    } 
    model.Permissions = checkBoxListItems; 
    PopulateRolesDropDownList(model.Role); 
    return View(model); 

}

Итак, отправляя форму для создания нового пользователя, пользователь сохраняется в базе данных, и выбранная роль также сохраняется. Но когда дело доходит до линии user.Permissions.Add(permission); он терпит неудачу с ошибкой:

System.NullReferenceException: Object reference not set to an instance of an object. 

Я добавил контрольные точки и может видеть, что ни user или permission равно нулю, когда он попадает в неисправной линии.

Было бы очень признательно, может кто-нибудь может сказать мне, почему я получаю эту ошибку?

+3

99% - Разрешения недействительны. Вам нужно создать объект этого списка. – MajkeloDev

+3

, вероятно, user.Permissions не инициализирован – Grievoushead

+0

В конструкторе ApplicationUser: Permissions = new List (). Вы пытаетесь добавить в список, который не существует –

ответ

1

Звучит как пользователь.

Редактировать: Перефразировать как ответ, а не вопрос. :-)

+0

Это вопрос или ответ? :) Ты в любом случае прав – MajkeloDev

Смежные вопросы