2013-03-12 14 views
12

Ho un problema con creo un campo personalizzato in UserProfile table.likeAsp.net MVC 4 come utilizzare WebSecurity.createUserAndAccount con il campo personalizzato

public class UserProfile 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int UserId { get; set; } 
     public int? AddressId { get; set; } 
     public int? UserDetailId { get; set; } 
     public string UserName { get; set; } 


     public UserDetail UserDetail { get; set; } 


    } 

    public class RegisterModel 
    { 
     [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 virtual UserDetail UserDetail { get; set; } 

    } 

    public class UserDetail 
    { 
     public int Id{get;set;} 
     public string FirstName{get;set;}  
     public string LastName{get;set;} 
    } 

E ho anche aggiunto UserDetail-DbContext classe

public DbSet<UserDetail> UserDetails{get;set;} 

Il problema è quando uso

Web WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
         new { UserDetail = new UserDetail() 
         }, false); 

E alw ays si presenta con un errore come: Nessuna mappatura esiste dal tipo di oggetto ... Ma se definisco un tipo semplice (come string, int) anziché UserDetail, funziona correttamente.

Chiunque può aiutarmi a risolvere questo problema? Grazie mille!!

risposta

12

Ho avuto un problema simile a questo, ma ho il lavoro da:

combinare UserDetail e ProfiloUtente a qualcosa su questa linea:

public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public string FirstName{get;set;}  
    public string LastName{get;set;} 
} 

aggiornamento tua [HttpPost] Registro

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
    propertyValues: new { FirstName= model.FirstName, LastName = model.LastName}, false); 

non dimenticare di aggiungere i nuovi campi nel tuo RegisterModel secondo necessità

public class RegisterModel 
{ 
    .... 
    public string FirstName{get;set;}  
    public string LastName{get;set;} 
} 

spero che questo funzioni per voi

4

Penso che stiate cercando di fare questo.

UserDetail

public class UserDetail 
{ 
    //This is property mapping, UserId will be the same as the Membership UserId and UserProfile UserId 
    [Key] 
    [ForeignKey("UserProfile")] 
    [HiddenInput(DisplayValue = false)] 
    public int UserId { get; set; } 

    public string FirstName{get;set;}  
    public string LastName{get;set;} 

    public UserProfile UserProfile { get; set; } 
} 

RegisterModel

public class RegisterModel 
{ 
    [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; } 

    [Required] 
    public string FirstName{get;set;} 

    [Required] 
    public string LastName{get;set;} 
} 

Registrati azione

// 
    // GET: /Account/Register 

    [AllowAnonymous] 
    public ActionResult Register() 
    { 
     return View(); 
    } 

    // 
    // POST: /Account/Register 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Register(RegisterModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var db = new UsersContext(); 
      // Attempt to register the user 
      try 
      { 
       var userProfile = WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, false); 

       //var userProfile= db.UserProfile.SingleOrDefault(u => u.UserName == model.UserName); 

       if (userProfile!= null) //This way Userdetail is only created if UserProfile exists so that it can retrieve the foreign key 
       { 
        var userDetail = new UserDetail 
              { 
               UserProfile = userProfile, 
               FirstName = model.FirstName, 
               LastName = model.LastName 
              };             

        db.UserDetails.Add(userDetail); 
        db.SaveChanges(); 
       }      
      } 
      catch (MembershipCreateUserException e) 
      { 
       ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

Modifica

A seconda di come è stato impostato il tuo Contesto e repository, avrete bisogno di qualcosa come di seguito per ciascuna delle classi POCO

public DbSet<UserProfile> UserProfiles { get; set; } 
    IQueryable<UserProfile> IDataSource.UserProfiles 
    { 
     get { return UserProfiles; } 
    } 

Oltre a SimpleMembership tabelle, è necessario aggiungere il segue al proprio contesto per many-to-many tra Membership and Roles

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Membership>() 
      .HasMany<Role>(r => r.Roles) 
      .WithMany(u => u.Members) 
      .Map(m => 
      { 
       m.ToTable("webpages_UsersInRoles"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("RoleId"); 
      }); 
    } 
+0

che sto testare il tuo codice, ma dice mio contesto non contiene una definizione per ProfiloUtente o per UserDetails! Supponiamo di aggiungere qualcosa al nostro contesto db? Sono bloccato anche con questo! – Ciwan

+0

@Ciwan vedi modifica nella risposta – Komengem

+0

Grazie, sono riuscito a superare il problema che stavo avendo, tuttavia sto ottenendo 'null' su questa riga' var userProfile = context.UserProfiles.SingleOrDefault (u => u.UserName == model.UserName); 'nessun motivo per questo? Quando controllo Db, il nome utente è stato creato, ma la tabella UserDetails è vuota, ovviamente perché quella riga restituisce null. – Ciwan

Problemi correlati