Membership.DeleteUser()失败,带有RI约束

时间:2012-10-06 19:45:48

标签: c# asp.net-membership

我在这里错过了一个概念。我假设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中删除此用户的所有记录,{ {1}}和User表,仅举几例。

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

2 个答案:

答案 0 :(得分:3)

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

您可以检查您的程序员是否已被更改。

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

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

答案 1 :(得分:0)

我有同样的问题。对我而言,这是因为我的数据库具有用于ASP成员身份的表和存储过程,但没有视图。我安装了九个视图,然后就可以了。我通过查看SP aspnet_Users_DeleteUser的实现来弄清楚。在其中,您可以看到由于某种奇怪的原因,它看起来在删除某些表中的记录之前先查看视图是否存在。由于该视图在我的数据库中不存在,因此它不是首先从aspnet_Membership中删除记录。