2012-10-20 29 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);