2013-03-12 4 views
12

У меня есть проблема с создать настраиваемое поле в UserProfile table.likeAsp.net MVC 4, как использовать WebSecurity.createUserAndAccount с настраиваемым полем

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

И я также добавил UserDetail в DbContext классе

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

Проблема заключается в том, когда я использую

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

это ALW ays появляется с некоторой ошибкой вроде: Отсутствует сопоставление типа объекта ... Но если я задаю простой тип (например, string, int) вместо UserDetail, он отлично работает.

Кто-нибудь может помочь мне решить эту проблему? Огромное спасибо!!

ответ

12

У меня была аналогичная проблема, к этому и получили его работы по:

объединить UserDetail и UserProfile к чему-то вдоль этой линии:

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

обновление вашего [HttpPost] Регистрация

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

не забудьте добавить новые поля в свой RegisterModel по мере необходимости

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

надеюсь, что это сработает для вас

4

Я думаю, что вы хотите это сделать.

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

Регистрация Действие

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

Edit

В зависимости от того, как вы создали свой контекст и хранилища, вам нужно будет что-то вроде ниже для каждого из ваших POCO классов

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

В дополнении к SimpleMembership таблицы, вам нужно будет добавить Ниже в контекст для many-to-many между 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

Я проверяю свой код, но он говорит, что мой контекст не содержит определения для UserProfile или UserDetails! Предположим ли мы добавить что-то в наш контекст db? Я тоже застрял! – Ciwan

+0

@Ciwan см. В ответе – Komengem

+0

Спасибо, мне удалось преодолеть проблему, с которой я столкнулся, однако я получаю 'null' в этой строке' var userProfile = context.UserProfiles.SingleOrDefault (u => u.UserName == model.UserName); 'любая причина для этого? Когда я проверяю Db, имя пользователя создано, но таблица UserDetails пуста, очевидно, потому что эта строка возвращает null. – Ciwan

Смежные вопросы