4

Membership.DeleteUser(string, bool)プロバイダーを使用する MVC 4 プロジェクトで試行するとSimpleMembership、次のエラー メッセージが表示されます。

「DELETE ステートメントが REFERENCE 制約 "fk_UserId" と競合しました。データベース "Conductor_Basic3"、テーブル "dbo.webpages_UsersInRoles"、列 'UserId' で競合が発生しました。ステートメントは終了しました。」

制約は正しく設定されているため、エラー メッセージがよくわかりません。私はここで何かを逃したと思います。

誰でもこのエラーを説明できますか?

4

5 に答える 5

8

テーブル webpages_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 テーブルに一致する行があるため、外部キー制約によりユーザー テーブルから行を削除できないようです。デフォルトのメンバーシップ プロバイダー スキーマにはあまり詳しくありませんが、そのエラーを回避するには、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 に答える