繁体   English   中英

使用SimpleMembership的AddUserToRole时出错:INSERT语句与FOREIGN KEY约束冲突

[英]Error using AddUserToRole of SimpleMembership: INSERT statement conflicted with the FOREIGN KEY constraint

我正在使用asp.net mvc4,c#和Entity Framework5。我试图使用简单成员身份(数据库优先方法)同时创建用户并向该用户分配角色,但是在Roles.AddUserToRole("nuser", "Admin");遇到以下错误Roles.AddUserToRole("nuser", "Admin");

INSERT语句与FOREIGN KEY约束“ FK_webpages_UsersInRoles_webpages_Roles”冲突。 数据库“ 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]

->“管理员”是角色名称

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错误。 如果这无法正常工作,您能否包括整个异常堆栈?

webpages_UsersInRoles表中UserIdRoleId交换顺序。 UserId应为第一列。

如果使用的是SimpleMembershp,则使用的是WebMatrix.WebData.SimpleRoleProvider 如果查看此类的定义,则没有定义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" });
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM