Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数据库中处理基于自定义角色的用户_C#_.net_Asp.net Mvc_Sql Server 2008_Sql Server 2005 - Fatal编程技术网

C# 在数据库中处理基于自定义角色的用户

C# 在数据库中处理基于自定义角色的用户,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

我正在处理一个我有5-6个角色的应用程序。是的,这是一件平常的事,但我面临一个问题。我正在处理自己的数据和表格

我查过其他帖子,但大部分都与会员有关。 为了处理这个问题,我创建了一个包含列的表

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
  • 名字
  • 电子邮件
  • 角色——在本专栏中,我存储了像
    教师
    学生
    等角色
  • 但现在我遇到了这样一种情况,用户可以 多重角色。假设一个用户是一名教师和一名学生,还有其他人

    因此,我的问题是,我应该如何管理我的数据库,以便它能够高效地工作,合理的数据库处理应该反映,并且在将来,在获取角色、检查“角色”和允许权限方面,它应该能够很好地工作

    我认为一个解决方案是将角色保留在不同的表中

    tblRoles

    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列的用户表
  • 至少有一个roleid列的角色表
  • 关系表使用至少一个userid列和一个roleid列链接用户表和角色表

  • 对于用户拥有的每个角色,关系表中都应该有一行,其中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
    名称空间