4

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

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

约束已设置并且是正确的,因此我无法真正理解错误消息。我想我在这里错过了一些东西。

谁能向我解释这个错误?

4

5 回答 5

8

看起来表 pages_Roles 引用了您的用户,您应该从角色中排除用户,然后您可以删除用户,试试这个:

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

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

在此处输入图像描述

于 2012-10-20T20:45:30.343 回答
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());
}
于 2013-06-13T07:00:10.780 回答
2

看起来外键约束不允许您从用户表中删除行,因为它们在 dbo.webpages_UsersInRoles 表中具有匹配的行。我对默认的 Membership Provider 架构不是很熟悉,但您必须确保删除 dbo.webpages_UsersInRoles 中的行以克服该错误。

于 2012-10-20T20:13:02.713 回答
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);
于 2014-11-18T09:40:27.400 回答
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
于 2014-03-14T15:52:31.817 回答