2

我在这里缺少一个概念。我假设这Membership.DeleteUser()会将用户从我的会员表中删除。我的代码:

// remove all but 'admin' from Membership
MembershipUserCollection users = Membership.GetAllUsers();

foreach ( MembershipUser user in users )
{
    if ( user.UserName != "admin" )
    {
        Membership.DeleteUser( user.UserName );
    }
}

DeleteUser()失败但有异常:

The DELETE statement conflicted with the REFERENCE constraint 
"FK__aspnet_Me__UserI__58D1301D". The conflict occurred in database 
"MyDatabase", table "dbo.aspnet_Membership", column 'UserId'.
The statement has been terminated.

在我的 Web.config 中:

<membership defaultProvider="MyMembershipProvider">
  <providers>
    <clear/>
    <add name="MyMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MembershipConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="5" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="MyApplication"/>
  </providers>
</membership>

我知道两者之间存在外键关系,Membership.UserId -> Users.UserId但会假设整个要点DeleteUser()是删除该用户在和表中的所有记录Membership,仅举几例。UserUsersInRoles

当然,我可以直接进入Membership表格并删除相应的记录,但这违背了使用 API 的目的。我究竟做错了什么?从成员资格表中删除用户的正确方法是什么?

4

2 回答 2

4

好吧,使用 trueMembership.DeleteUser(string)调用SqlMembershipProvider.DeleteUser(string, bool),并且调用存储的 proc aspnet_Users_DeleteUser。该存储过程中包含用于删除其他相关表中的各种额外数据的代码。

你可以检查你的sproc,看看它是否被改变了。

我能想到的唯一另一件事是您是否创建了与成员资格表的任何其他外键关系,例如您自己的用户表?如果是这样,您必须先删除这些记录。这是不建议创建此类外键关系的原因之一。

检查 aspnet_Membership 表上的 FK 关系,看看是否有任何不应该存在的。

于 2012-10-06T20:15:34.897 回答
1

我有同样的问题。对我来说,原来是因为我的数据库有 ASP 成员的表和存储过程,但没有视图。我安装了九个视图,然后它工作了。我通过查看 SP aspnet_Users_DeleteUser 的实现找到了答案。在其中,您可以看到出于某种奇怪的原因,它会在从某些表中删除记录之前查看视图是否存在。由于我的数据库中不存在该视图,因此它没有首先从 aspnet_Membership 中删除记录。

于 2019-02-05T12:25:37.203 回答