2013-03-12 36 views
12

Tôi có một vấn đề với tôi tạo ra một lĩnh vực tùy chỉnh trong UserProfile table.likeAsp.net MVC 4 làm thế nào để sử dụng WebSecurity.createUserAndAccount với lĩnh vực tùy chỉnh

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

Và tôi cũng nói thêm UserDetail-DbContext lớp

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

vấn đề là khi tôi sử dụng

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

Nó ALW ays đi kèm với một số lỗi như: Không có ánh xạ tồn tại từ loại đối tượng ... Nhưng nếu tôi xác định một loại đơn giản (như string, int) thay vì UserDetail, nó hoạt động tốt.

Bất cứ ai cũng có thể giúp tôi giải quyết vấn đề này? Cảm ơn rất nhiều!!

Trả lời

12

Tôi đã có một vấn đề tương tự như này và đã cho nó hoạt động bằng cách:

kết hợp UserDetail và UserProfile một cái gì đó dọc theo dòng này:

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

cập nhật của bạn [HttpPost] Đăng ký

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

đừng quên thêm các trường mới vào RegisterModel của bạn khi cần

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

hy vọng điều này phù hợp với bạn

4

Tôi nghĩ bạn đang tìm cách làm điều này.

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

Đăng ký Action

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

Sửa

Tùy thuộc vào cách bạn đã thiết lập Bối cảnh và kho của bạn, bạn sẽ cần một cái gì đó như dưới đây cho mỗi lớp POCO bạn

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

Ngoài SimpleMembership bảng, bạn sẽ cần phải thêm sau đây để hoàn cảnh của bạn cho many-to-many giữa 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

tôi đang thử nghiệm ra mã của bạn, nhưng nó nói bối cảnh của tôi không chứa một định nghĩa cho UserProfile hoặc cho UserDetails! Có phải chúng ta giả sử thêm một cái gì đó vào bối cảnh db của chúng ta không? Tôi đang mắc kẹt với điều này quá! – Ciwan

+0

@Ciwan xem chỉnh sửa trong câu trả lời – Komengem

+0

Cảm ơn, tôi quản lý để vượt qua vấn đề tôi đã có, tuy nhiên tôi nhận được 'null' trên dòng này' var userProfile = context.UserProfiles.SingleOrDefault (u => u.UserName == model.UserName); 'bất kỳ lý do nào cho điều này? Khi tôi kiểm tra Db, tên người dùng đã được tạo, nhưng bảng UserDetails trống, rõ ràng là vì dòng đó trả về null. – Ciwan

Các vấn đề liên quan