2013-05-21 11 views
8

Sono quasi sicuro di aver seguito tutti i passaggi, ma sembra che abbia perso qualcosa. Utilizzo di SimpleMembership nell'app MVC4. Aggiungi email alla tabella UserProfile e nei modelli Register e UserProfile, l'ha aggiunta al metodo Register, ma continua a ricevere l'errore. Ecco il codice:SimpleMembership - Aggiungi email a UserProfile - System.Data.SqlClient.SqlException: nome di colonna non valido Errore "Email"

Modelli:

public class UserProfile 
{ 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public string Email { get; set; } 
} 

public class RegisterModel 
{ 
    [Display(Name = "Email Address")] 
    [StringLength(20)] 
    // [Required] 
    public string Email { get; set; } 

    [Display(Name = "Date of Birth")] 
    // [Required] 
    public DateTime DOB { get; set; } 

    [Required] 
    [System.Web.Mvc.Remote("VerifyUserExists", "Account", ErrorMessage="That Username is already taken.")] 
    [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; } 
} 

Controller:

public ActionResult Register(RegisterModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // Attempt to register the user 
      try 
      { 
       WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email }); 
       WebSecurity.Login(model.UserName, model.Password); 

       return RedirectToAction("Index", "Home"); 
      } 
      catch (MembershipCreateUserException e) 
      { 
       ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); 
      } 


     } 

Io non sto cercando di utilizzare l'indirizzo email per il login, voglio solo prendere durante la fase di registrazione in modo Posso inviare un'e-mail di conferma automatica.

Ho provato con la tabella UserProfile inclusa nel modello EF e con questa, nessuna differenza. Ho confermato che la tabella nel DB ha una colonna Email.

+0

Quello che hai qui sembra buono. Forse hai più di un database di cui non sei a conoscenza (come un file). A che punto dell'esecuzione ricevi l'errore? – Jasen

+0

Errore su questa riga: WebSecurity.CreateUserAndAccount (model.UserName, model.Password, new {Email = model.Email}); La cartella AppData è vuota e le uniche stringhe di connessione passano alla mia istanza localdb in SQL Server 2012, dove è presente il db. Ho cercato il metodo CreateUserAndAccount per scoprire dove sta cercando di salvare, ma non ho trovato nulla finora. – BattlFrog

+0

Quando chiamate 'WebSecurity.InitializeDatabaseConnection', quale stringa di connessione state usando (ed è il database giusto)? –

risposta

0

Se si sta utilizzando la connessione predefinita, aprire il database facendo clic su Visualizza -> Esplora server, quindi espandere DefaultConnection. Sotto Tabelle vedrai la tabella UserProfile. Aggiungi prima le colonne alla tabella e aggiorna il database, quindi aggiungi i campi aggiuntivi alla classe.

0

Suppongo che la proprietà Email (nella classe UserProfile) sia stata aggiunta dopo aver già eseguito l'applicazione per la prima volta, quindi se la tabella esiste già prima di aver modificato il modello e aggiunto la proprietà Email, Potrebbe essere la causa dell'eccezione.

come lei stesso ha citato in uno dei vostri commenti:

Se rimuovo la sezione, nuova {e-mail etc 'dal metodo Register nel controller, passare bene

Per risolvere questo, penso che devi fare somthing come che nella vostra DbContext campoN classe (supponendo che si utilizza il codice primo approccio):.

 public class myDbContext: DbContext 
{ 
    public myDbContext() 
     : base("DefaultConnection") 
    { 
     Database.SetInitializer<myDbContext>(new DropCreateDatabaseIfModelChanges<myDbContext>()); 
    } 

    public DbSet<UserProfile> UserProfiles { get; set; } 

} 

L'impostazione di default è CreateDatabaseIfNotExists, quindi se la tua tabella UserProfile era già esistente, non l'ha creata di nuovo e non ha trovato la tua nuova proprietà Email (era nel tuo modello ma non nella tabella del database);