2012-10-06 42 views
1

我在这里错过了一个概念。我假设Membership.DeleteUser()会从我的会员表中清除用户。我的代码:Membership.DeleteUser()与RI约束失败

// 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,中的所有记录和UsersInRoles表格等等。

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

+0

您使用的是默认的SqlMembershipProvider吗? –

+0

@MystereMan - 是的,请参阅上面的修改。 –

回答

3

那么,Membership.DeleteUser(string)调用SqlMembershipProvider.DeleteUser(string, bool)与真,并且调用存储过程aspnet_Users_DeleteUser。该存储过程有代码来删除其他相关表中的各种额外数据。

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

我能想到的唯一的其他事情是您是否为Membership表创建了任何其他外键关系,例如您自己的用户表?如果是这样,您将不得不先删除这些记录。这是不建议创建这种外键关系的一个原因。

检查aspnet_Membership表上的FK关系,看看有没有不应该在那里。

+0

为了您的观点,我*想*做出这样的外键关系,但决定这将是一个非常糟糕的主意。目前,我发现了一些可以直接从Membership和UsersInRoles表中删除记录的方法。请参阅上面我最近的修改。我对此并不满意,但因为这是一个只供站长管理员使用的臭名昭着的网页的一部分,现在就是我,我会让它站起来。 –

+0

@BobKaufman - 如果你想解决问题,你将不得不看看存储过程,看看它为什么不删除依赖数据。 –

+0

@BobKaufman - 你有没有机会删除aspnet的意见?特别是,vw_aspnet_UsersInRoles?如果该视图不存在,则不会删除对象 –