【问题标题】:How do I delete my identity users?如何删除我的身份用户?
【发布时间】:2017-08-29 18:44:46
【问题描述】:

我正在尝试删除重复但聪明的用户,他们发现他们可以使用多个电子邮件创建帐户。我的应用程序有一个 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”、表“dbo.UserLogs”、“Customer_Id”列中。这 语句已终止。

【问题讨论】:

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


    【解决方案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 两次。

    【讨论】:

    • 成功了!此外,我已经删除了我两次调用SaveChanges() 的应用程序中的其他位置。除了代码味道,你能详细说明为什么这样做不好吗?
    • 还不错,有时你真的需要在一个函数中多次调用SaveChanges。通过调用 SaveChanges,您可以将缓存的 EF 对象从当前上下文提交到数据库。所以在你的例子中你有两个问题。 1. 您尝试在将日志选择到上下文中后立即从数据库中删除日志(第一次 savechanges 调用),然后您尝试删除错误的用户。每次完成数据库操作或在继续该方法之前确实需要保存数据时调用 savechanges。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2019-05-04
    • 2023-03-25
    • 2010-10-11
    • 1970-01-01
    • 2021-02-28
    • 2015-08-08
    相关资源
    最近更新 更多