使用SimpleMembership删除用户mvc 4时出错

时间:2012-10-20 20:08:22

标签: asp.net-mvc membership-provider

当我在使用Membership.DeleteUser(string, bool)提供程序的MVC 4项目中尝试SimpleMembership时,出现以下错误消息:

  

“DELETE语句与REFERENCE约束冲突   “fk_UserId”。冲突发生在数据库“Conductor_Basic3”中,   表“dbo.webpages_UsersInRoles”,列'UserId'。声明有   已被终止。“

约束已设置且正确,因此我无法真正理解错误消息。我想我在这里错过了什么。

有人可以向我解释这个错误吗?

5 个答案:

答案 0 :(得分:8)

看起来表webpages_Roles引用了您的用户,您应该将用户排除在角色之外,之后您可以删除用户,请尝试以下操作:

 Roles.RemoveUserFromRole("UserName","RoleName");
 Membership.DeleteUser("UserName");

或者您可以尝试使用其他方法:在数据库中明确指定级联删除,如下所示:

enter image description here

答案 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