2013-05-21 29 views
8

Tôi khá chắc chắn rằng tôi đã làm theo tất cả các bước, nhưng dường như đã bỏ lỡ một cái gì đó. Sử dụng simplemembership trong ứng dụng MVC4. Thêm Email vào bảng UserProfile và trong các mô hình Đăng ký và UserProfile, thêm nó vào phương thức Đăng ký, nhưng vẫn nhận được lỗi. Dưới đây là một số mã:SimpleMembership - Thêm email vào UserProfile - System.Data.SqlClient.SqlException: Tên cột "Email" không hợp lệ lỗi

Models:

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; } 
} 

Bộ điều khiển:

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)); 
      } 


     } 

Tôi không cố gắng sử dụng địa chỉ email như đăng nhập, chỉ muốn lấy nó trong bước đăng ký để Tôi có thể gửi email xác nhận tự động.

Tôi đã thử với bảng UserProfile được bao gồm trong mô hình EF, và với nó ra, không có sự khác biệt. Tôi đã xác nhận bảng trong DB có một cột Email.

+0

Những gì bạn có ở đây có vẻ tốt. Có thể bạn có nhiều cơ sở dữ liệu mà bạn không biết (như một tệp). Tại điểm nào trong quá trình thực hiện, bạn có nhận được lỗi không? – Jasen

+0

Lỗi trên dòng này: WebSecurity.CreateUserAndAccount (model.UserName, model.Password, mới {Email = model.Email}); Thư mục AppData trống và các chuỗi kết nối duy nhất đi đến cá thể localdb của tôi trong SQL Server 2012, trong đó db là. Tôi đã nghiên cứu phương pháp CreateUserAndAccount để tìm ra nơi mà nó đang cố gắng tiết kiệm, nhưng đã đến với không có gì cho đến nay. – BattlFrog

+0

Khi bạn gọi 'WebSecurity.InitializeDatabaseConnection', chuỗi kết nối nào bạn đang sử dụng (và đó là cơ sở dữ liệu đúng)? –

Trả lời

0

Nếu bạn đang sử dụng kết nối mặc định, hãy mở cơ sở dữ liệu bằng cách nhấp vào Xem -> Trình khám phá máy chủ rồi mở rộng DefaultConnection. Trong Bảng, bạn sẽ thấy bảng UserProfile. Thêm các cột của bạn vào bảng đầu tiên và cập nhật cơ sở dữ liệu, sau đó thêm các trường bổ sung của bạn vào lớp.

0

Tôi đoán rằng thuộc tính Email (trong lớp UserProfile) là nơi bạn đã thêm sau khi bạn đã thực thi ứng dụng lần đầu tiên, vì vậy nếu bảng đã tồn tại trước khi bạn thay đổi mô hình và thêm thuộc tính Email, Nó có thể là nguyên nhân của ngoại lệ.

như bạn đề cập đến chính mình trong một trong những bình luận của bạn:

Nếu tôi loại bỏ các phần, mới {Email vv 'từ phương pháp ký trong bộ điều khiển, nó vượt qua tốt

Để khắc phục rằng, tôi nghĩ bạn cần phải làm mọi thứ như thế trong lớp DbContext deriven của bạn. (giả sử bạn sử dụng cách tiếp cận mã đầu tiên):

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

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

} 

Cài đặt mặc định là CreateDatabaseIfNotExists, vì vậy nếu bảng UserProfile của bạn đã tồn tại, nó không tạo lại nó và không tìm thấy thuộc tính Email mới của bạn (Nó nằm trong mô hình của bạn nhưng không có trong bảng cơ sở dữ liệu);