2012-10-06 41 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?如果該視圖不存在,則不會刪除對象 –