Я расширяю класс 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
равно нулю, когда он попадает в неисправной линии.
Было бы очень признательно, может кто-нибудь может сказать мне, почему я получаю эту ошибку?
99% - Разрешения недействительны. Вам нужно создать объект этого списка. – MajkeloDev
, вероятно, user.Permissions не инициализирован – Grievoushead
В конструкторе ApplicationUser: Permissions = new List(). Вы пытаетесь добавить в список, который не существует –