2017-08-29 68 views
1

我想删除重复但聪明的用户,他们发现他们可以使用多个电子邮件创建一个帐户。我的应用程序有一个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'中发生冲突 。 声明已被终止。

回答

1

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

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

但后来你试图通过用户名从方法参数删除用户。我怀疑UserName等于目前在用户中。

首先,将用户标识传递给方法。通过这个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两次。

+0

工作!另外,我已经在我的应用程序中删除了其他地方,我调用了SaveChanges()两次。除了是一种代码味道之外,你能详细说明为什么它不好吗? – Skullomania

+0

这并不坏,有时你真的需要在一个函数中多次调用SaveChanges。通过调用SaveChanges,您可以将缓存的EF对象从当前上下文提交到数据库。所以在你的例子中你有两个问题。 1.您试图从数据库中删除日志,只需在上下文中选择它们(第一次savechanges调用),然后尝试删除错误的用户。每次您完成数据库工作时调用savechanges,或者在继续使用该方法之前确实需要保存数据。 – DolceVita