.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 Role 36  { 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; } //父级角色ID 44 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 #endregion 14 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 #endregion 23 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 #endregion 50 }

  修改站点项目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 schema 14  ((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 try 10  { 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 form 22 return View(model); 23 }

  运行项目,注册用户:

  OK,我们的用户信息及角色信息扩展成功!

转载于:https://www.cnblogs.com/libra1006/p/3896096.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值