2013-03-12 7 views
12

Ich habe ein Problem mit ich ein benutzerdefiniertes Feld in UserProfile table.likeAsp.net Mvc 4 wie WebSecurity.createUserAndAccount verwenden, um mit benutzerdefinierten Feld

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

erstellen Und ich fügte auch UserDetail-DbContext Klasse

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

Das Problem ist, wenn ich

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

Es verwenden ALW Ays kommt mit einem Fehler wie: Keine Zuordnung existiert vom Objekttyp ... Aber wenn ich einen einfachen Typ (wie string, int) anstelle von UserDetail definieren, funktioniert es gut.

Kann mir jemand helfen, dieses Problem zu lösen? Vielen Dank!!

Antwort

12

hatte ich ein ähnliches Problem auf diese und bekam es funktioniert durch:

kombinieren UserDetail und Userprofile zu etwas entlang dieser Linie:

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

Update Ihr [Httppost]

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

Vergessen Sie nicht, die neuen Felder bei Bedarf in Ihr RegisterModel einzufügen.

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

hoffe, das funktioniert für Sie

4

Ich denke, Sie suchen, dies zu tun.

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

Register Aktion

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

bearbeiten

Je nachdem, wie Sie Ihren Kontext und Repositories eingerichtet haben, werden Sie für jede Ihrer POCO Klassen so etwas wie unten benötigen

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

Zusätzlich Tabellen SimpleMembership, müssen Sie die hinzufügen folgende zu Ihrem Kontext für many-to-many zwischen 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

ich teste den Code, aber es sagt mein Kontext keine Definition für Userprofile oder für Userdetails enthalten! Sollen wir unserem db-Kontext etwas hinzufügen? Ich stecke auch damit fest! – Ciwan

+0

@Ciwan siehe Bearbeiten in der Antwort – Komengem

+0

Danke, ich habe es geschafft, über das Problem, das ich hatte, zu bekommen, aber ich bekomme 'null' in dieser Zeile' var userProfile = Kontext.UserProfiles.SingleOrDefault (u => u.UserName == model.UserName); 'irgendeinen Grund dafür? Wenn ich Db überprüfe, wurde der Benutzername erstellt, aber die Tabelle UserDetails ist leer, offensichtlich weil diese Zeile null zurückgibt. – Ciwan

Verwandte Themen