C# 使用SimpleMembership的AddUserToRole时出错:INSERT语句与外键约束冲突
我正在使用asp.NETMVC4、c#和实体框架5。我试图创建一个用户,同时使用简单的成员身份(数据库优先的方法)将角色分配给该用户,但在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
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保存数据,但需要知道为什么成员身份会产生问题