当前位置: 首页 > 编程语言 > C#

C#学习教程:.NETCore2.1Identity为所有用户提供相关角色分享

时间:2023-04-10 23:51:17 C#

.NETCore2.1Identity为所有用户提供相关角色我认为这会相当容易,但显然不是。我尝试了以下解决方案:https://stackoverflow.com/a/43562544/5392786但到目前为止还没有解决方案。这是我到目前为止所拥有的:ApplicationUser:publicclassApplicationUser:IdentityUser{publicListRoles{get;放;}}DbContextpublicclassApplicationDbContext:IdentityDbContext{publicApplicationDbContext(DbContextOptionsoptions):base(options){}}启动标识代码services.AddIdentity(options=>options.Stores.MaxLengthForKeys=128).AddEntityFrameworkStores().AddDefaultTokenProviders();我要显示列表的Razor页面:publicclassIndexModel:PageModel{privatereadonlyUserManageruserManager;publicIndexModel(UserManageruserManager){this.userManager=userManager;}公共IEnumerable用户{得到;放;}publicvoidOnGetAsync(){this.Users=userManager.Users.Include(u=>u.Roles).ToList();调用userManager.Users.Include(u=>u.Roles).ToList();时出现以下错误userManager.Users.Include(u=>u.Roles).ToList();:MySql.Data.MySqlClient。MySqlException:“字段列表”中的“未知列”u.Roles.ApplicationUserId#8217;我现在已经实施了以下解决方案正如CodeNotFound在评论中指出的那样,IdentityUser曾经有一个Roles属性。在.NETCore中不再是这种情况。GitHub上的这个评论/问题似乎是.NetCore的当前解决方案。我尝试用下面的代码实现它:ApplicationUserpublicclassApplicationUser:IdentityUser{publicICollectionUserRoles{get;放;}}ApplicationUserRolepublicclassApplicationUserRole:IdentityUserRole{publicvirtualApplicationUserUser{get;放;}publicvirtualApplicationRole角色{get;放;}}ApplicationRolepublicclassApplicationRole:IdentityRole{publicICollectionUserRoles{get;放;}}的DbContext公共类ApplicationDbContext:IdentityDbContext,ApplicationUserRole,IdentityUserLogin,IdentityRoleClaim,IdentityUserToken>{publicApplicationDbContext(DbContextOptionsoptions):base(options){}protectedoverridevoidOnModelCreating(ModelBuilderbuilder){base.OnModelCreating(builder);builder.Entity(userRole=>{userRole.HasKey(ur=>new{ur.UserId,ur.RoleId});userRole.HasOne(ur=>ur.Role).WithMany(r=>r.UserRoles).HasForeignKey(ur=>ur.RoleId).IsRequired();userRole.HasOne(ur=>ur.User).WithMany(r=>r.UserRoles).HasForeignKey(ur=>ur.UserId).IsRequired();});}}开始服务最后,确保在使用它时,你急切地加载了用户的UserRoles,然后是UserRole的角色,就像这样:this.Users=userManager.Users.Include(u=>u.UserRoles).ThenInclude(ur=>ur.Role).ToList();我遇到了一个问题,每个UserRole的Role属性为null,这是通过添加.ThenInclude(ur=>ur.Role)部分解决的Microsoftdoconmulti-leveleagerloading:https://docs.microsoft.com/en-us/ef/core/querying/related-data#including-multiple-levels参考注释首先是获取数据公共异步的代码TaskGetUserList(){varuserList=await(fromuserin_context.Usersselectnew{UserId=user.Id,Username=user.UserName,user.Email,user.EmailConfirmed,RoleNames=(fromuserRoleinuser.Roles//[AspNetUserRoles]joinrolein_context.Roles//[AspNetRoles]//onuserRole.RoleIdequalsrole.Idselectrole.Name).ToList()}).ToListAsync();varuserListVm=userList.Select(p=>newAccountViewModel{UserId=p.UserId,UserName=p.Username,Email=p.Email,Roles=string.Join(",",p.RoleNames),EmailConfirmed=p.EmailConfirmed.ToString()});返回userListVm;在ASP.Netcore2.1中,我们像这样设置ApplicationRole来获取用户的角色。您需要确定要显示式公开的数据以提供用户使用publicclassApplicationRole:IdentityRole{publicvirtualICollection>Users{get;放;}publicvirtualICollection>Claims{get;放;}}最后protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){base.OnModelCreating(modelBuilder);foreach(varrelationshipinmodelBuilder.Model.GetEntityTypes().SelectMany(e=>e.GetForeignKeys())){relationship.DeleteBehavior=DeleteBehavior.Restrict;}modelBuilder.Entity().HasMany(u=>u.Claims).WithOne().HasForeignKey(c=>c.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);modelBuilder.Entity().HasMany(u=>u.Roles).WithOne().HasForeignKey(r=>r.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);modelBuilder.Entity().HasMany(r=>r.Claims).WithOne().HasForeignKey(c=>c.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade);modelBuilder.Entity().HasMany(r=>r.Users).WithOne().HasForeignKey(r=>r.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade);modelBuilder.EnableAutoHistory(null);结果将是用户名和用户角色如果用户有多个角色,数据将显示为管理员、编辑等...完整的代码可以在这里和这里找到希望这有帮助。以上为C#学习教程:.NETCore2.1Identity为所有用户提供相关角色共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,并不代表侵权,如有侵权,请点击右边联系管理员删除。如需转载请注明出处: