当我在使用Membership.DeleteUser(string, bool)
提供程序的MVC 4项目中尝试SimpleMembership
时,出现以下错误消息:
“DELETE语句与REFERENCE约束冲突 “fk_UserId”。冲突发生在数据库“Conductor_Basic3”中, 表“dbo.webpages_UsersInRoles”,列'UserId'。声明有 已被终止。“
约束已设置且正确,因此我无法真正理解错误消息。我想我在这里错过了什么。
有人可以向我解释这个错误吗?
答案 0 :(得分:8)
看起来表webpages_Roles引用了您的用户,您应该将用户排除在角色之外,之后您可以删除用户,请尝试以下操作:
Roles.RemoveUserFromRole("UserName","RoleName");
Membership.DeleteUser("UserName");
或者您可以尝试使用其他方法:在数据库中明确指定级联删除,如下所示:
答案 1 :(得分:2)
看起来外键约束不允许您从用户表中删除行,因为它们在dbo.webpages_UsersInRoles表中具有匹配的行。我对默认的成员资格提供程序架构不是很熟悉,但您必须确保删除dbo.webpages_UsersInRoles中的行以获取该错误。
答案 2 :(得分:2)
你可以试试这个:
[Authorize(Roles = "Admin")]
[HttpPost]
public ActionResult DeleteUser(int id)
{
var tmpuser = "";
var ctx = new UsersContext();
using (ctx)
{
var firstOrDefault = ctx.UserProfiles.FirstOrDefault(us => us.UserId==id);
if (firstOrDefault != null)
tmpuser = firstOrDefault.UserName;
}
string[] allRoles = Roles.GetRolesForUser(tmpuser);
Roles.RemoveUserFromRoles(tmpuser,allRoles);
//Roles.RemoveUserFromRole(tmpuser, "RoleName");
((SimpleMembershipProvider)Membership.Provider).DeleteAccount(tmpuser);
Membership.Provider.DeleteUser(tmpuser, true);
Membership.DeleteUser(tmpuser, true);
ctx = new UsersContext();
return View(ctx.UserProfiles.OrderBy(user => user.UserName).ToList());
}
答案 3 :(得分:1)
有同样的问题并通过扩展@testCoder的答案来解决它。
var rolesProvider = (SimpleRoleProvider)Roles.Provider;
var roles = rolesProvider.GetRolesForUser(username);
if (roles != null && roles.Length > 0)
{
rolesProvider.RemoveUsersFromRoles(new[] { username }, roles);
}
Membership.DeleteUser(username, true);
答案 4 :(得分:0)
除了testCoder给出的内容之外,还有一些适用于我的实现......
Public Shared Sub DeleteUser(User As String)
Dim UserRoles = Roles.GetRolesForUser(User)
If UserRoles.Count > 0 Then Roles.RemoveUserFromRoles(User, UserRoles)
DirectCast(Membership.Provider, WebMatrix.WebData.SimpleMembershipProvider).DeleteAccount(User)
DirectCast(Membership.Provider, WebMatrix.WebData.SimpleMembershipProvider).DeleteUser(User, True)
End Sub