MVC4 Simplemembership 扩展自己的数据库结构
第一步:用户信息表UserProfile
在实际使用起来,需要向UserProfile添加自己的字段,例如Email,PhoneNumber,Address等等。
实现起来非常简单只需在UserProfile中声明一下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.ComponentModel.DataAnnotations;
- using System.Data.Entity;
- using System.ComponentModel.DataAnnotations.Schema;
- namespace TYStudio
- {
- [Table("UserProfile")]
- public class UserProfile
- {
- [Key]
- [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
- [Display(Name="ID")]
- public int UserId { get; set; }
- [Display(Name = "用户名")]
- [StringLength(250)]
- public string UserName { get; set; }
- [Display(Name = "邮件地址")]
- [StringLength(250)]
- public string Email { get; set; }
- }
- }
重新运行之后数据库字段就生成了。这样就可以根据自己的需要添加各种用户注册信息了。
第二步:角色表webpages_Roles
扩展webpages_Roles表,与TYStudioMembership,PermissionsInRoles关连,这两个表后面会有介绍。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.ComponentModel.DataAnnotations;
- using System.Data.Entity;
- using System.ComponentModel.DataAnnotations.Schema;
- namespace TYStudio
- {
- [Table("webpages_Roles")]
- public class Role
- {
- public Role()
- {
- Members = new List<TYStudioMembership>();
- PermissionsInRoles = new List<PermissionsInRoles>();
- }
- [Key]
- [Display(Name = "ID")]
- public int RoleId { get; set; }
- [Display(Name = "名称")]
- [StringLength(256)]
- public string RoleName { get; set; }
- public ICollection<TYStudioMembership> Members { get; set; }
- [ForeignKey("RoleId")]
- public ICollection<PermissionsInRoles> PermissionsInRoles { set; get; }
- }
- }
第三步:webpages_Membership
添加webpages_Membership表,这个主要存储Membership的信息内容,以后要用到(比如重置密码)
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.ComponentModel.DataAnnotations;
- using System.Data.Entity;
- using System.ComponentModel.DataAnnotations.Schema;
- namespace TYStudio
- {
- [Table("webpages_Membership")]
- public class TYStudioMembership
- {
- public TYStudioMembership()
- {
- Roles = new List<Role>();
- }
- [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
- public int UserId { get; set; }
- public DateTime? CreateDate { get; set; }
- [StringLength(128)]
- public string ConfirmationToken { get; set; }
- public bool? IsConfirmed { get; set; }
- public DateTime? LastPasswordFailureDate { get; set; }
- public int PasswordFailuresSinceLastSuccess { get; set; }
- [Required, StringLength(128)]
- public string Password { get; set; }
- public DateTime? PasswordChangedDate { get; set; }
- [Required, StringLength(128)]
- public string PasswordSalt { get; set; }
- [StringLength(128)]
- public string PasswordVerificationToken { get; set; }
- public DateTime? PasswordVerificationTokenExpirationDate { get; set; }
- [StringLength(128)]
- public string PasswordResetToken { get; set; }
- public ICollection<Role> Roles { get; set; }
- }
- }
第四步:权限表webpages_Permission
添加webpages_Permission表,用来存储具体的Action权限。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.ComponentModel.DataAnnotations;
- using System.Data.Entity;
- using System.ComponentModel.DataAnnotations.Schema;
- namespace TYStudio
- {
- [Table("webpages_Permission")]
- public class Permission
- {
- public Permission()
- {
- PermissionsInRoles = new List<PermissionsInRoles>();
- }
- [Key]
- [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
- [Display(Name="权限ID")]
- public int PermissionId { get; set; }
- [Display(Name = "名称")]
- public string PermissionName { get; set; }
- [ForeignKey("PermissionId")]
- public ICollection<PermissionsInRoles> PermissionsInRoles { set; get; }
- }
- }
第五步:关系表webpages_PermissionsInRoles
添加角色权限关系表webpages_PermissionsInRoles。用来存储角色的具体权限。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.ComponentModel.DataAnnotations;
- using System.Data.Entity;
- using System.ComponentModel.DataAnnotations.Schema;
- namespace TYStudio
- {
- [Table("webpages_PermissionsInRoles")]
- public class PermissionsInRoles
- {
- [Key]
- public int Id { get; set; }
- public int RoleId { get; set; }
- public int PermissionId { get; set; }
- [Column("RoleId"), InverseProperty("PermissionsInRoles")]
- public Role Role { get; set; }
- [Column("PermissionId"), InverseProperty("PermissionsInRoles")]
- public Permission Permission { get; set; }
- }
- }
第六步:修改UserContext
数据库的扩展类添加完毕之后,最后还需要修改UserContext,来添加新的实体类集合,并注册他们之间的关系。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.ComponentModel.DataAnnotations;
- using System.Data.Entity;
- using System.ComponentModel.DataAnnotations.Schema;
- namespace TYStudio
- {
- public class TYStudioMembershipContext : DbContext
- {
- public TYStudioMembershipContext()
- : base("TYStudioUsersConnectionString")
- {
- }
- public DbSet<UserProfile> UserProfiles { get; set; }
- public DbSet<TYStudioMembership> TYStudioMemberships { get; set; }
- public DbSet<Role> Roles { get; set; }
- public DbSet<Permission> Permissions { get; set; }
- public DbSet<PermissionsInRoles> PermissionsInRoles { get; set; }
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<TYStudioMembership>()
- .HasMany<Role>(r => r.Roles)
- .WithMany(u => u.Members)
- .Map(m =>
- {
- m.ToTable("webpages_UsersInRoles");
- m.MapLeftKey("UserId");
- m.MapRightKey("RoleId");
- });
- }
- }
- }
最后还需要修改上篇文章InitializeSimpleMembershipAttribute类。如果数据库存在就删除重建,这是为了生成数据库方便,数据库建好后就可以注释掉了。当然你也可以手动删除Sqlserver中的数据库,下面新加的代码就不需要了,效果是一样的.
- private class SimpleMembershipInitializer
- {
- public SimpleMembershipInitializer()
- {
- Database.SetInitializer<TYStudioMembershipContext>(null);
- try
- {
- using (var context = new TYStudioMembershipContext())
- {
- if (!context.Database.Exists())
- {
- // Create the SimpleMembership database without Entity Framework migration schema
- ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
- }
- }
- WebSecurity.InitializeDatabaseConnection("TYStudioUsersConnectionString", "UserProfile", "UserId", "UserName", autoCreateTables: true);
- }
- catch (Exception ex)
- {
- 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);
- }
- }
- }
至此数据库的扩展就完成了。
编译运行程序(记得要点页面右上角的Register按钮)后,你会得到如下面截图的数据库:
下篇文章介绍如何使用SimpleMembership对Action进行具体的权限控制。
原创文章,转载请注明出处谢谢。
您好,请问除了UserProfiles外,其他的类在哪扩展呢?全部在AccountModels.cs里吗?
Members = new List();提示:使用泛型 类型“System.Collections.Generic.List”需要 1 个类型参数这个List是引用了什么类呢?
modelBuilder.Entity()提示:无法从用法中推导出方法“System.Data.Entity.DbModelBuilder.Entity()”的类型实参。请尝试显式指定类型实参。
你好!我想问一下你那个“TYStudioMembership.cs”是什么作用?小白的提问,见笑了
TYStudioMembership用来存储一些membership的信息,用户名的密码和修改密码用到的一些验证,通常情况下只会用到password,
没有向UserProfile添加字段前运行了项目 然后数据库中只有UserID 和UserName两个字段
向UserProfile添加自己的字段,例如Email,PhoneNumber,Address等等。
为什么我向UserProfile中添加了字段后 重新运行了项目
然后去数据库中看了下表结构
表结构中还是只有UserID 和UserName两个字段而没有我添加的新的字段呢?
请赐教!
数据库删了,重新生成以下应该能解决.
这样不合适啊,正在运行的项目怎么能这么干。如何通过这个Model直接变更数据库结构??
正在运行的项目数据库那方面的东西好改。你先建立一个数据库,运行一下这个程序把各个表结构生成,然后手动的merge到你们原有的数据库,这样你们原有的数据库不就有表格了么,然后把web.config中的连接串改到新的库就可以了,记得注释一下自动生成表接口那块(不用注释也没关系,那段已经做了判断,判断有没有,有了就不加了), 麻烦的是把你需要的新权限一个个的加到原有的系统中。