Note that there are some explanatory texts on larger screens.

plurals
  1. POMVC 5 custom user
    text
    copied!<p>So I have been playing with MVC 5 recently and I love it. I have come across something that I thought would be simple to do, but has ended up eating into hours of my day and I am none the wiser.</p> <p>Basically I want to extend the <strong>User</strong> model by adding my own properties. I did this:</p> <pre><code>public class IdentityUser : User { public IdentityUser() //: this(String.Empty) { } public IdentityUser(string userName) : base(userName) { } public string UserId { get; set; } public string CompanyId { get; set; } [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredTitle")] public string Title { get; set; } [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredFirstName")] public string Forename { get; set; } [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredLastName")] public string Surname { get; set; } [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredUserName")] public string UserName { get; set; } [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredEmail")] public string Email { get; set; } public string JobTitle { get; set; } public string Telephone { get; set; } public string Mobile { get; set; } public string Photo { get; set; } public string LinkedIn { get; set; } public string Twitter { get; set; } public string Facebook { get; set; } public string Google { get; set; } public string Bio { get; set; } public string CompanyName { get; set; } [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredCredentialId")] public string CredentialId { get; set; } [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "RequiredSecurityCode")] public string Code { get; set; } public bool IsLockedOut { get; set; } public bool IsApproved { get; set; } public DateTime LastLoginDate { get; set; } [Display(Name = "Can only edit own assets")] public bool UserCanEditOwn { get; set; } [Display(Name = "Can edit assets")] public bool UserCanEdit { get; set; } [Display(Name = "Can download assets")] public bool UserCanDownload { get; set; } [Display(Name = "Require approval to upload assets")] public bool UserRequiresApproval { get; set; } [Display(Name = "Can approve assets")] public bool UserCanApprove { get; set; } [Display(Name = "Can synchronise assets")] public bool UserCanSync { get; set; } public bool AgreedTerms { get; set; } } public class IdentityUserContext : IdentityStoreContext { public IdentityUserContext(DbContext db) : base(db) { this.Users = new UserStore&lt;IdentityUser&gt;(this.DbContext); } } public class IdentityUserDbContext : IdentityDbContext&lt;IdentityUser, UserClaim, UserSecret, UserLogin, Role, UserRole&gt; { } </code></pre> <p><strong>User</strong> is the default User class in EF </p> <pre><code>namespace Microsoft.AspNet.Identity.EntityFramework { public class User : IUser { public User(); public User(string userName); [Key] public string Id { get; set; } public string UserName { get; set; } } } </code></pre> <p>I have inherited it because I read somewhere that you have to do that if you want to use a custom class. Anyway, I then changed my Register model to look like this:</p> <pre><code>public class RegisterViewModel { [Required] [Display(Name = "User name")] public string UserName { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] public string ConfirmPassword { get; set; } public string Title { get; set; } [Required] public string Forename { get; set; } [Required] public string Surname { get; set; } [Required] public string Email { get; set; } public string CompanyName { get; set; } [Required] public string CredentialId { get; set; } [Required] public string Code { get; set; } } </code></pre> <p>and the method to look like this:</p> <pre><code>[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task&lt;ActionResult&gt; Register(RegisterViewModel model) { if (ModelState.IsValid) { try { // Create a profile, password, and link the local login before signing in the user var companyId = Guid.NewGuid().ToString(); var user = new IdentityUser( model.UserName) { CompanyId = companyId, Title = model.Title, Forename = model.Forename, Surname = model.Surname, Email = model.Email, CompanyName = model.CompanyName, CredentialId = model.CredentialId }; if (await IdentityStore.CreateLocalUser(user, model.Password)) { await AuthenticationManager.SignIn(HttpContext, user.Id, isPersistent: false); return RedirectToAction("Setup", new { id = user.CompanyId }); } else { ModelState.AddModelError("", "Failed to register user name: " + model.UserName); } } catch (IdentityException e) { ModelState.AddModelError("", e.Message); } } // If we got this far, something failed, redisplay form return View(model); } </code></pre> <p>When I try to register I get this error:</p> <pre><code>Mapping and metadata information could not be found for EntityType 'TestProject.Models.IdentityUser'. </code></pre> <p>I can't figure out why.</p> <p>Am I missing a step or something?</p> <p>any help would be greatly appreciated</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload