Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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#_Sql Server_Database_Entity Framework - Fatal编程技术网

C# 实体框架-具有多对多表的用户和组

C# 实体框架-具有多对多表的用户和组,c#,sql-server,database,entity-framework,C#,Sql Server,Database,Entity Framework,我遇到了一个让我左右为难的问题。我需要实现的是我们网站中的用户和组。我们在C#中使用实体框架(数据库优先)和ASP.NET 以下是要求: 有用户 存在组(由管理员创建,并将存在于数据库中) 每个用户可以在一个或多个组中 每个组可以有0个或更多用户 目前的工作组是: 管理员 董事会 编辑 简言之,“User1”可以同时位于Editor和Board of Directors组中,但不能是Administrator组的成员 首先,我用一个Users、一个Groups和一个UserGroups表构建了我

我遇到了一个让我左右为难的问题。我需要实现的是我们网站中的用户和组。我们在C#中使用实体框架(数据库优先)和ASP.NET

以下是要求:

  • 有用户
  • 存在组(由管理员创建,并将存在于数据库中)
  • 每个用户可以在一个或多个组中
  • 每个组可以有0个或更多用户
  • 目前的工作组是: 管理员 董事会 编辑

    简言之,“User1”可以同时位于Editor和Board of Directors组中,但不能是Administrator组的成员

    首先,我用一个Users、一个Groups和一个UserGroups表构建了我的数据库。userGroups表包含以下字段:

    这种方法的问题是,EF不允许我向该表添加多个用户,因为它是一个1用户对多用户的关系,因此抛出“违反多重性约束”错误

    因此,我通过删除PK将其更改为多对多表,如下所示:

    User              Group
    -----------       ------------
    UserId (PK)       GroupId (PK)
    Name              Name
    ...               ...
    
           \           /
              UserGroup
             -------------
              UserId (FK)
              GroupId (FK)
    
    我现在可以访问user.Group,并可以向该用户添加组。当我向组中添加用户时,我查询现有组并按如下方式添加:

    Add(ctx.Groups.Where(g=>g.GroupID==12).First()

    问题是,这在Groups表中为此用户创建了一个新组,即使该组的ID在保存到数据库时是正确的(12)

    我需要做以下几件事:

  • 创建一个用户并将新用户放入一个或多个组中
  • 编辑现有用户以将其添加到组或从组中删除
  • 我确信我做错了什么(可能是头晕目眩),但如果有人能帮我做到这一点,我会非常感激

    提前谢谢

    Admin_AddUser.aspx.cs中的代码:

    User user = new User( );
    user.CustomerID = CustomerID;
    user.IsClub = false;
    user.IsDistrict = true;
    user.FirstName = txtFirstName.Text;
    user.LastName = txtLastName.Text;
    user.Email = txtEmail.Text;
    user.Password = txtPassword.Text;
    user.AccountActive = true;
    
    foreach( RadListBoxItem item in lbSelectedRoles.Items )
    {
      user.Roles.Add( UserData.GetRole( DCManager.Instance.SiteSettings.Customer.CustomerID, int.Parse( item.Value ) ) );
    }
    
    bool rtn = UserData.CreateUser( user );
    ...
    
    CreateUser方法中的代码:

    public static bool CreateUser( User user )
    {
      using ( var ctx = new DCEntities( ) )
      {
        //Check if the login credentials already exist
        if ( ctx.Users.Where( u => u.Email == user.Email
                               && u.Password == user.Password ).Count( ) > 0 )
          return false;
        else
        {
          ctx.Users.Add( user );
          ctx.SaveChanges( );
    
          return true;
        }
      }
    }
    
    =========================

    在我的项目中,组和组实际上称为“角色”

    由于数据库中的UserGroups表是多对多表,因此它不会显示在EDMX文件中,但用户和组(my DB中的角色)链接为多对多。

    映射详细信息:


    如果我正确理解了您的问题,我建议您执行以下操作:

  • 创建一个表UsersAndGroups(int:PK,UserId:FK,GroupId:FK)
  • 在用户和用户以及组之间建立一对多的关系
  • 在组和用户以及组之间建立一对多的关系
  • 删除用户和组之间的关系
  • 这将允许您执行以下操作:

  • 通过向UsersAndGroups表中添加行,将用户添加到一个或多个组
  • 通过从UsersAndGroups表中选择具有特定用户ID的所有记录来获取用户组
  • 通过从UsersAndGroups表中选择具有特定GroupId的所有记录来获取组用户
  • 希望我理解正确。

    首先使用代码:

    添加角色

    public virtual List<User> Users { get; set; }
    

    你能发布你的映射吗?嗨,mmillican-我不确定你所说的映射是什么意思。你是指从SQL还是EF EDMX方面?如果你不先使用代码,EDMX。好的-你想从映射详细信息窗口发布它吗?针对哪些对象?两个用户和组?是的,这应该都可以。嗨,Aleh-我想你理解我的意思。我做到了最初(创建了3个表),但EF将用户和组端的关系作为一对多。您是否建议我总共创建5个表?再添加2个“桥接”用于在UsersAndGroups&Users和UsersAndGroups&Groups之间创建多对多关系的表?嗨,Nutkraker,我的错。从用户到UsersAndGroups和从组到UsersAndGroups的关系应该是一对多(编辑).Hi-Aleh-问题是,在我需要用户能够加入多个组的情况下,用户只能是一个组的一部分。Hi-Nutkraker-用户可以是任意数量组的成员。UsersAndGroups表中的每个记录定义了用户和组之间的关系。User和group表与每个ot无关因此,要将用户添加到组中,只需向UsersAndGroups表中再添加一条记录即可。
    public virtual List<User> Users { get; set; }
    
    public virtual List<Role> Roles { get; set; }
    
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    
    namespace MyProject.EFTest
    {
        public class Role
        {
            [Key]
            public int RoleID { get; set; }
    
            [Required]
            [StringLength(100)]
            public string Name { get; set; }
    
            public virtual List<User> Users { get; set; }
    
        }
    
        public class User
        {
            [Key]
            public int UserID { get; set; }
    
            public string Name { get; set; }
    
            public virtual List<Role> Roles { get; set; }
    
        }
    
    }
    
        CreateTable(
            "dbo.UserRole",
            c => new
                {
                    User_UserID = c.Int(nullable: false),
                    Role_RoleID = c.Int(nullable: false),
                })
            .PrimaryKey(t => new { t.User_UserID, t.Role_RoleID })
            .ForeignKey("dbo.User", t => t.User_UserID)
            .ForeignKey("dbo.Role", t => t.Role_RoleID)
            .Index(t => t.User_UserID)
            .Index(t => t.Role_RoleID);