我在这里错过了一个概念。我假设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表中删除用户的正确方法是什么?
答案 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中删除记录。