首页 > 代码库 > .NET MVC4 实训记录之二(扩展WebSecurity模型下的UserProfile表)
.NET MVC4 实训记录之二(扩展WebSecurity模型下的UserProfile表)
使用VS2013创建MVC4项目后,自动生成的代码中默认使用WebSecurity模型创建用户管理,生成以下数据库:
用户信息只有ID和UserName,角色信息也只有两个基础字段。通常情况下这样的数据表不能满足我们的需求,因此对其进行扩展。
首先定义自己的用户信息、角色信息结构。
1 [Table("UserProfile")] 2 public class UserProfile 3 { 4 [Key] 5 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 6 [Column(Order = 0)] 7 public int UserId { get; set; } 8 9 [Column(Order = 1)]10 [Required]11 public string UserName { get; set; }12 13 [Column(Order = 2)]14 public string UserCode { get; set; }15 16 [Column(Order = 3)]17 public int Status { get; set; }18 19 [Column(Order = 4)]20 public string Email { get; set; }21 22 [Column(Order = 5)]23 public int? Gender { get; set; }24 25 [Column(Order = 6)]26 public int? CreatorId { get; set; }27 28 public virtual ICollection<Role> Roles { get; set; }29 }30 31 /// <summary>32 /// 角色信息为树状结构33 /// </summary>34 [Table("webpages_Roles")]35 public class Role36 {37 [Key]38 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]39 [Column(Order = 0)]40 public int RoleId { get; set; }41 42 [Column(Order = 1)]43 public int? ParentId { get; set; } //父级角色ID44 45 [Required]46 [Column(Order = 2)]47 public string RoleName { get; set; }48 49 [Column(Order = 3)]50 public int TreeLevel { get; set; }51 52 [Column(Order = 4)]53 public string TreePath { get; set; }54 55 [Column(Order = 5)]56 public int Status { get; set; }57 58 [Column(Order = 6)]59 public string Description { get; set; }60 61 [ForeignKey("ParentId")]62 public virtual Role Parent { get; set; }63 64 [InverseProperty("Parent")]65 public virtual ICollection<Role> Children { get; set; }66 67 public virtual ICollection<UserProfile> Users { get; set; }68 }
创建数据库上下文类型UsersContext:
1 public class UsersContext: DbContext, IDisposable 2 { 3 #region 数据表映射实例 4 public DbSet<UserProfile> UserProfiles { get; set; } 5 6 public DbSet<Role> Roles { get; set; } 7 #endregion 8 9 #region 构造10 public UsersContext() : base("DefaultConnection") { }11 12 public UsersContext(string connectionString) : base(connectionString) { }13 #endregion14 15 #region 事件16 protected override void OnModelCreating(DbModelBuilder modelBuilder)17 {18 //配置用户角色关系表19 modelBuilder.Entity<Role>().HasMany(p => p.Users).WithMany(p => p.Roles).Map(m => { m.ToTable("webpages_UsersInRoles"); m.MapLeftKey("UserId"); m.MapRightKey("RoleId"); });20 base.OnModelCreating(modelBuilder);21 }22 #endregion23 24 #region 析构25 public event EventHandler Disposed;26 27 public bool IsDisposed { get; private set; }28 29 public new void Dispose()30 {31 Dispose(true);32 }33 34 protected new void Dispose(bool disposing)35 {36 lock (this)37 {38 if (disposing && !IsDisposed)39 {40 base.Dispose();41 var evt = Disposed;42 if (evt != null) evt(this, EventArgs.Empty);43 Disposed = null;44 IsDisposed = true;45 GC.SuppressFinalize(this);46 }47 }48 }49 #endregion50 }
修改站点项目Filters目录下的InitializeSimpleMembershipAttribute.cs文件中的构造器。
1 private class SimpleMembershipInitializer 2 { 3 public SimpleMembershipInitializer() 4 { 5 Database.SetInitializer<Framework.DomainModels.UsersContext>(null); //这里使用我们刚刚定义的数据库上下文 6 7 try 8 { 9 using (var context = new Framework.DomainModels.UsersContext()) //这里使用我们刚刚定义的数据库上下文10 {11 if (!context.Database.Exists())12 {13 // Create the SimpleMembership database without Entity Framework migration schema14 ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();15 }16 }17 18 WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);19 }20 catch (Exception ex)21 {22 throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);23 }24 }25 }
删除原有数据库,重新运行项目,点击注册按钮,这时生成新的数据库。
在提交注册用户之前,让我们再做一些修改。找到AccountController下的Register方法(Post类型),对其进行以下修改:
1 [HttpPost] 2 [AllowAnonymous] 3 [ValidateAntiForgeryToken] 4 public ActionResult Register(RegisterModel model) 5 { 6 if (ModelState.IsValid) 7 { 8 // Attempt to register the user 9 try10 {11 WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Status = 1 /* 在UserProfile表中,该字段为必填。如还有其它必填字段,只需在此添加即可 */ });12 WebSecurity.Login(model.UserName, model.Password);13 return RedirectToAction("Index", "Home");14 }15 catch (MembershipCreateUserException e)16 {17 ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));18 }19 }20 21 // If we got this far, something failed, redisplay form22 return View(model);23 }
运行项目,注册用户:
OK,我们的用户信息及角色信息扩展成功!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。