.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,我们的用户信息及角色信息扩展成功!