如何删除我的身份用户?

时间:2017-08-29 18:44:46

标签: c# asp.net-mvc entity-framework asp.net-identity

我正在尝试删除重复但聪明的用户,他们已经发现他们可以使用多个电子邮件创建帐户。我的应用程序有一个UserLog,我可以通过该网站跟踪我的用户,以进行风险管理。这是我的UserLog类:

public class UserLog
{
    public int Id { get; set; }
    public ApplicationUser Customer { get; set; }
    public DateTime LogDate { get; set; }
}

在我的ManageUsers控制器中,我知道在删除用户之前我需要删除用户创建的日志,因为我在课堂上创建了FK_constraint。最后我尝试删除用户。这是我试过的:

public ActionResult Delete(string UserName)
{
    var ocustomerId = User.Identity.GetUserId();
    var oCustomer = _context.Users.Single(u => u.Id == ocustomerId).ToString();

    //delete user logs
    _context.UserLogs
       .Where(p => p.Customer.Id == oCustomer)
       .ToList()
       .ForEach(p => _context.UserLogs.Remove(p));
    _context.SaveChanges();

    //finally delete from aspnetUsers table
    var thisUser =
    _context.Users.FirstOrDefault(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase));
    _context.Users.Remove(thisUser);
    _context.SaveChanges(); \\it breaks here
    return RedirectToAction("Index");
}

正如预期的那样,代码的第一部分按预期工作,删除用户创建的日志。第二个context.SaveChanges()发生错误。

断点生成的错误是:

  

EntityFramework.dll

中发生DbUpdateException错误

然而,实际错误页面上生成的错误如下:

  

DELETE语句与REFERENCE约束冲突" FK_dbo.UserLogs_dbo.AspNetUsers_Customer_Id"。冲突发生了   在数据库" myDB",table" dbo.UserLogs",column' Customer_Id'。该   声明已被终止。

1 个答案:

答案 0 :(得分:1)

您删除当前登录用户的日志:

 var ocustomerId = User.Identity.GetUserId();
 var oCustomer = _context.Users.Single(u => u.Id == ocustomerId).ToString();

但稍后您尝试通过方法参数中的UserName删除用户。我怀疑用户名当前等于用户名。

首先,将用户ID传递给方法。通过此ID检索用户,然后删除条目

     public ActionResult Delete(string UserName)
    {
var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();

        var user = userManager.FindByName(UserName);

        _context.UserLogs
           .Where(p => p.Customer.Id == user.Id)
           .ToList()
           .ForEach(p => _context.UserLogs.Remove(p));

        _context.SaveChanges(); 
        userManager.Delete(user);
        return RedirectToAction("Index");
    }

顺便说一下,不要两次调用SaveChanges。