2012-10-20 65 views
3

當我嘗試在我使用SimpleMembership提供一個MVC 4項目Membership.DeleteUser(string, bool)用戶MVC 4時,我得到以下錯誤信息:錯誤刪除使用SimpleMembership

「DELETE語句衝突與基準約束 」 fk_UserId 「。衝突發生在數據庫」Conductor_Basic3「, 表」dbo.webpages_UsersInRoles「,列'UserId'。該語句有 被終止。

設置約束條件並且是正確的,所以我無法真正理解錯誤消息。我想我在這裏錯過了一些東西。

任何人都可以向我解釋這個錯誤嗎?

回答

2

看起來外鍵約束不允許您從用戶表中刪除行,因爲它們在dbo.webpages_UsersInRoles表中具有匹配的行。我對默認的成員資格提供程序架構不是很熟悉,但是您必須確保刪除dbo.webpages_UsersInRoles中的行以獲取過去的錯誤。

+1

愚蠢的是,這些會員表是由一個小小的命令行腳本安裝的,應該是開箱即用的。但是你是對的,只是有點煩人,腳本會讓你95%去你想去的地方,然後不會告訴你需要採取更多的步驟。但與Oracle對你的做法相比,這沒什麼。 –

7

貌似表webpages_Roles有參考你的用戶,你應該排除從角色的用戶,之後,你能刪除用戶,試試這個:

Roles.RemoveUserFromRole("UserName","RoleName"); 
Membership.DeleteUser("UserName"); 

或者你可以嘗試使用其他方法:明確指定級聯刪除在你的數據庫是這樣的:

enter image description here

2

你可以試試這個:

[Authorize(Roles = "Admin")] 
[HttpPost] 
public ActionResult DeleteUser(int id) 
{ 
    var tmpuser = ""; 
    var ctx = new UsersContext(); 
    using (ctx) 
    { 
     var firstOrDefault = ctx.UserProfiles.FirstOrDefault(us => us.UserId==id); 
     if (firstOrDefault != null) 
      tmpuser = firstOrDefault.UserName; 
    } 

    string[] allRoles = Roles.GetRolesForUser(tmpuser); 
    Roles.RemoveUserFromRoles(tmpuser,allRoles); 

    //Roles.RemoveUserFromRole(tmpuser, "RoleName"); 

    ((SimpleMembershipProvider)Membership.Provider).DeleteAccount(tmpuser); 
    Membership.Provider.DeleteUser(tmpuser, true); 
    Membership.DeleteUser(tmpuser, true); 

    ctx = new UsersContext(); 

    return View(ctx.UserProfiles.OrderBy(user => user.UserName).ToList()); 
} 
+0

這是我整理出來的東西,謝謝! –

+0

@ barnacle.m歡迎! – TotPeRo

0

除了什麼被testCoder給出,這裏是爲我工作細一些實施...

Public Shared Sub DeleteUser(User As String) 
    Dim UserRoles = Roles.GetRolesForUser(User) 
    If UserRoles.Count > 0 Then Roles.RemoveUserFromRoles(User, UserRoles) 
    DirectCast(Membership.Provider, WebMatrix.WebData.SimpleMembershipProvider).DeleteAccount(User) 
    DirectCast(Membership.Provider, WebMatrix.WebData.SimpleMembershipProvider).DeleteUser(User, True) 
End Sub 
1

有同樣的問題,並通過擴大@testCoder的回答有點解決它。

var rolesProvider = (SimpleRoleProvider)Roles.Provider; 
var roles = rolesProvider.GetRolesForUser(username); 
if (roles != null && roles.Length > 0) 
{ 
    rolesProvider.RemoveUsersFromRoles(new[] { username }, roles); 
} 
Membership.DeleteUser(username, true);