[英]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
表中UserId
和RoleId
交换顺序。 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.