Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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# SQL错误:无法插入外键值,因为相应的主键值不存在_C#_Sql_Razor_Security Roles_Webmatrix 2 - Fatal编程技术网

C# SQL错误:无法插入外键值,因为相应的主键值不存在

C# SQL错误:无法插入外键值,因为相应的主键值不存在,c#,sql,razor,security-roles,webmatrix-2,C#,Sql,Razor,Security Roles,Webmatrix 2,我正在使用标准的WebSecurity功能创建一个manageroles-Admin页面 我得到了这个错误的答案 无法插入外键值,因为相应的主键值不存在。[外键约束名称=fk_用户ID] 在以下代码行中: if(!Roles.IsUserInRole(userNames[0], roleNames[0])){ Roles.AddUsersToRoles(userNames, roleNames); } 我的理解是,各个表应该用userId列链接。他们是。我正在使用WebMatri

我正在使用标准的
WebSecurity
功能创建一个manageroles-Admin页面

我得到了这个错误的答案

无法插入外键值,因为相应的主键值不存在。[外键约束名称=fk_用户ID]

在以下代码行中:

if(!Roles.IsUserInRole(userNames[0], roleNames[0])){
       Roles.AddUsersToRoles(userNames, roleNames);
}
我的理解是,各个表应该用
userId
列链接。他们是。我正在使用WebMatrix 2和Razor框架进行开发

您有什么想法或解决方案吗?非常感谢

下面是我如何处理它的代码片段

 @{
    var roleName = "";
    string[] userNames = new string[1];
    string[] roleNames = new string[1];

    var db = Database.Open("ResearchA");
    var selectQueryString = "SELECT UserId, username FROM [usernames]";

  if(IsPost){

    // Create new role
    if(!Request["buttonCreateRole"].IsEmpty()){
      roleName=Request["textRoleName"];

      if(!Roles.RoleExists(roleName) && !roleName.IsEmpty()){
        Roles.CreateRole(roleName);
      }
    } 

    // Delete role

    if(!Request["buttonDeleteRole"].IsEmpty()){
      roleName=Request["textRoleName"];

      if(Roles.GetUsersInRole(roleName).Length == 0 && !roleName.IsEmpty()){
        Roles.DeleteRole(roleName, true); 
      }
    } 

    // Add user to role

    if(!Request["buttonAddUserToRole"].IsEmpty()){
      userNames[0] = Request["selectUserName"];
      roleNames[0] = Request["selectRoleName"];

      if(!Roles.IsUserInRole(userNames[0], roleNames[0])){
       Roles.AddUsersToRoles(userNames, roleNames);
      }
    }

    // Delete user from role

    if(!Request["buttonDeleteUserFromRole"].IsEmpty()){
      userNames[0] = Request["selectUserName"];
      roleNames[0] = Request["selectRoleName"];

      if(Roles.IsUserInRole(userNames[0], roleNames[0])){
        Roles.RemoveUsersFromRoles(userNames, roleNames);
      }
    } 
  }
}

不确定,但听起来好像您正在尝试手动创建用户表和角色表


你试过运行aspnet_regsql.exe吗?您可以在“%WINDIR%\Microsoft.NET\Framework\v4.0.30319”目录中找到它。它将打开一个向导,使用SQL脚本在同一个“%WINDIR%\Microsoft.NET\Framework\v4.0.30319\”目录中创建相应的表。

能否发送更多信息,Roles.AddUsersToRoles是如何工作的?似乎AddUsersToRoles必须接受用户而不是用户名,角色[]而不是角色名称或类似的内容。这是如何实现的?我猜
userNames
中的一个元素在数据库(在users表中)中不存在,因此连接表(连接用户和角色)中的外键被违反。此外,您只检查第一个用户/角色,但可能会将多个用户添加到多个角色中。这是故意的吗?@BrankoDimitrijevic是的,这是故意的。我正在发布代码的第一部分,这样你就可以知道我是怎么做的:谢谢布莱恩。我在上面发布了相关的代码片段,以防你能从中有所收获。