我正在尝试删除重复但聪明的用户,他们已经发现他们可以使用多个电子邮件创建帐户。我的应用程序有一个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'。该 声明已被终止。
答案 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。