Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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/7/user-interface/2.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# 使用SimpleMembership的AddUserToRole时出错:INSERT语句与外键约束冲突_C#_Entity Framework_Asp.net Mvc 4_Simplemembership - Fatal编程技术网

C# 使用SimpleMembership的AddUserToRole时出错:INSERT语句与外键约束冲突

C# 使用SimpleMembership的AddUserToRole时出错:INSERT语句与外键约束冲突,c#,entity-framework,asp.net-mvc-4,simplemembership,C#,Entity Framework,Asp.net Mvc 4,Simplemembership,我正在使用asp.NETMVC4、c#和实体框架5。我试图创建一个用户,同时使用简单的成员身份(数据库优先的方法)将角色分配给该用户,但在Roles.AddUserToRole(“用户”、“管理员”)处出现以下错误: INSERT语句与外键约束冲突 “FK_网页用户角色网页角色”。冲突发生在 数据库“DbClick2Eat”,表“dbo.webpages_Roles”,列“RoleId”。 声明已终止 这是我的密码:- [HttpPost] [ValidateAntiForger

我正在使用asp.NETMVC4、c#和实体框架5。我试图创建一个用户,同时使用简单的成员身份(数据库优先的方法)将角色分配给该用户,但在
Roles.AddUserToRole(“用户”、“管理员”)处出现以下错误:

INSERT语句与外键约束冲突 “FK_网页用户角色网页角色”。冲突发生在 数据库“DbClick2Eat”,表“dbo.webpages_Roles”,列“RoleId”。 声明已终止

这是我的密码:-

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult CreateUserByAdmin(RegisterModel register, string role)
        {
            try
            {
                if (Roles.RoleExists(role))
                {
                    var model = register ?? new RegisterModel();
                    WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
                    if (WebSecurity.UserExists(model.UserName))
                        Roles.AddUserToRole("admin1", "Admin");
                }
                else
                   ModelState.AddModelError("NoRole", "Please select a role.");

                var roles = Roles.GetAllRoles().ToList();
                ViewBag.DeliveryArea = new SelectList(roles.Select(x => new { Value = x, Text = x }), "Value", "Text");
                return View();
            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", AccountController.ErrorCodeToString(e.StatusCode));
            }
            return View();
        }
数据库模式

CREATE TABLE [dbo].[webpages_Roles](
    [RoleId] [int] IDENTITY(1,1) NOT NULL,
    [RoleName] [nvarchar](256) NOT NULL,
 CONSTRAINT [PK_webpages_Roles] PRIMARY KEY CLUSTERED 
(
    [RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[webpages_UsersInRoles](
    [RoleId] [int] NOT NULL,
    [UserId] [int] NOT NULL,
 CONSTRAINT [PK_webpages_UsersInRoles] PRIMARY KEY NONCLUSTERED 
(
    [RoleId] ASC,
    [UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [dbo].[webpages_UsersInRoles]  WITH CHECK ADD  CONSTRAINT [FK_webpages_UsersInRoles_UserProfile] FOREIGN KEY([UserId])
REFERENCES [dbo].[UserProfile] ([UserId])
GO
ALTER TABLE [dbo].[webpages_UsersInRoles] CHECK CONSTRAINT [FK_webpages_UsersInRoles_UserProfile]
GO
ALTER TABLE [dbo].[webpages_UsersInRoles]  WITH CHECK ADD  CONSTRAINT [FK_webpages_UsersInRoles_webpages_Roles] FOREIGN KEY([RoleId])
REFERENCES [dbo].[webpages_Roles] ([RoleId])
GO
ALTER TABLE [dbo].[webpages_UsersInRoles] CHECK CONSTRAINT [FK_webpages_UsersInRoles_webpages_Roles]
->“Admin”是一个角色名

RoleId=1,RoleName=Admin

表中存在“管理员”角色。我无法修复它。。。需要帮助,请拨打电话:

if (WebSecurity.UserExists(model.UserName)) roles.AddUserToRole("admin1", "Admin")
您是否将“admin1”硬编码设置为紫色?因为如果您这样做了,这可能是您获得外键错误的原因,因为此组合可能已经存在于数据库中

将此更改为:

if (WebSecurity.UserExists(model.UserName)) roles.AddUserToRole(model.Username, "Admin")
应该解决这个问题

在CreateUserByAdmin上下文中,我不确定您要做什么。 您是在试图通过管理员将用户添加到数据库中,还是必须成为管理员的用户

更新

你能像这样修改你的代码吗? 尝试 {

            var model = register ?? new RegisterModel();
            if (!WebSecurity.UserExists(model.UserName))
            {
                WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
            }
            if (Roles.RoleExists(role))
            {
                Roles.AddUserToRole(model.UserName, role);
            }
            else ModelState.AddModelError("NoRole", "Please select a role.");

            var roles = Roles.GetAllRoles().ToList();
            ViewBag.DeliveryArea = new SelectList(roles.Select(x => new { Value = x, Text = x }), "Value", "Text");
            return View();
        }
        catch (MembershipCreateUserException e)
        {
            ModelState.AddModelError("", AccountController.ErrorCodeToString(e.StatusCode));
        }
        return View();
这样,我们至少可以排除已有用户上的fk错误。
如果这不起作用,您可以将整个异常堆栈包括在内吗?
UserId
RoleId
的交换顺序放在
webpages\u UsersInRoles
表中。
UserId
应该是第一列。

如果您使用的是SimpleMembershp,那么您正在使用。如果您查看此类的定义,则没有AddUserToRole方法已定义,我不确定使用该方法将获得何种行为。之所以可以使用此方法,是因为您使用的是System.Web.Security.Roles,而没有将其强制转换为实际使用的提供程序,即SimpleRoleProvider。啊哈,这是保险箱在使用SimpleMembership时可以这样做

var roles = (WebMatrix.WebData.SimpleRoleProvider)Roles.Provider;
if (!roles.GetRolesForUser(model.UserName).Contains("Admin"))
{
    roles.AddUsersToRoles(new[] { model.UserName }, new[] { "Admin" });
}

在代码中,您只是在将用户映射到角色之前检查用户是否存在。您真正想要检查的是,在将用户添加到角色之前,映射是否已经存在,如上面的代码片段所示。这将消除任何外键冲突。

您能提供角色表(DB Scheme和管理员记录)吗请获取更多信息?@stefchri,感谢回复。我已经添加了DB架构。感谢回复,1.最初我使用以下代码//model.UserName和role comming from View Roles.AddUserToRole(model.UserName,role);2.我可以使用DBContext保存数据,但需要知道为什么成员身份会产生问题