C# 在数据库中处理基于自定义角色的用户
我正在处理一个我有5-6个角色的应用程序。是的,这是一件平常的事,但我面临一个问题。我正在处理自己的数据和表格 我查过其他帖子,但大部分都与会员有关。 为了处理这个问题,我创建了一个包含列的表 TblUsersC# 在数据库中处理基于自定义角色的用户,c#,.net,asp.net-mvc,sql-server-2008,sql-server-2005,C#,.net,Asp.net Mvc,Sql Server 2008,Sql Server 2005,我正在处理一个我有5-6个角色的应用程序。是的,这是一件平常的事,但我面临一个问题。我正在处理自己的数据和表格 我查过其他帖子,但大部分都与会员有关。 为了处理这个问题,我创建了一个包含列的表 TblUsers Role_Id Role 1 Client 2 Teacher 3 Student 4 Superitendent 5 Principal User_Id
Role_Id Role
1 Client
2 Teacher
3 Student
4 Superitendent
5 Principal
User_Id Name Email Roles
1 Pin hh 1
2 Sin mm 1,2
3 ll ii 3,2
4 uu hv 3
教师
、学生
等角色Role_Id Role
1 Client
2 Teacher
3 Student
4 Superitendent
5 Principal
User_Id Name Email Roles
1 Pin hh 1
2 Sin mm 1,2
3 ll ii 3,2
4 uu hv 3
然后将角色保留在users表中,如下所示
tblUsers
Role_Id Role
1 Client
2 Teacher
3 Student
4 Superitendent
5 Principal
User_Id Name Email Roles
1 Pin hh 1
2 Sin mm 1,2
3 ll ii 3,2
4 uu hv 3
或
但是这样做会使编码变得复杂吗
如果我使用上述技巧,我将如何加入并获得角色
假设Id为2的用户已经登录,为了获得用户角色,我必须这样做
var Roles=get Roles from tblUsers where user_id= 2
然后
然后检查计数并获得如下角色
var User_Role = get Role from tblRoles where Role='Roles[0]' ;
若我在角色数组中有多个值,那个么我必须一次又一次地调用数据库
请帮我解决这个问题。你的建议对我很有帮助。教科书中的经典解决方案是制作三张表格:
对于用户拥有的每个角色,关系表中都应该有一行,其中userid是用户的id,roleid是对应角色的id。这种解决方案是最灵活和可扩展的,当您需要查询某些信息时,如果您能够熟练地使用SQL的“连接表”技巧,它将永远不会复杂。创建一个表作为UserRoleMapping和列 映射Id、用户Id、角色Id
根据分配给该表的角色数,该表将针对一个用户有多行。执行此操作的典型方法是使用包含角色的不同表。 喜欢err user_roles(user_id,roles),其中user_id是外键
USER_ID ROLES
1 1
1 2
2 2
因此,此表与用户表是多对一关系。删除
角色
列并添加用户角色
表。这是最好的办法
解决m:n关系的关键是分离两个实体,并使用第三个相交实体在它们之间创建两个一对多(1:n)关系
如果使用实体框架,所有查询都将很简单。
例如:
db.Users.Find(2).Roles.ToList(); //Get all roles of User(2)
db.Roles.Find(1).Users.ToList();//Get all Teacher
您可以按如下方式制作表格: tblUsers:
User_Id Name Email
1 Pin hh
2 Sin mm
3 ll ii
4 uu hv
TBL孔:
Role_Id Role
1 Client
2 Teacher
3 Student
4 Superitendent
5 Principal
t卢塞罗莱斯:
User_Id Role_Id
1 1
1 2
1 5
3 4
3 2
要使用此表,您可以简单地使用如下sql查询:
WITH Roles_CTE(User_Id, Role) AS(
SELECT User_Id.tblUserRoles, Role.tblRoles FORM tblUserRoles INNER JOIN tblRoles
ON tblUserRoles.Role_Id = tblRoles.Role_Id)
SELECT User_Id.tblUsers, Name.tblUsers, Role.Roles_CTE FROM
Roles_CTE INNER JOIN tblUsers ON tblUsers.User_Id = Roles_CTE.User_Id
要在c#中使用此查询,您应该使用ADO.NET组件。
对于像您这样的sql server用户,有System.Data.SqlClient
名称空间