繁体   English   中英

在表上放置约束后,如何删除asp.net身份用户?

[英]How do I remove an asp.net identity user when constraints have been placed on the table?

在此ActionResult我将从ASP.NET Users表中删除用户。

public ActionResult Delete(string UserName)
{
    var thisUser =
    _context.Users.FirstOrDefault(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase));
    _context.Users.Remove(thisUser);
    _context.SaveChanges();
    return RedirectToAction("Index");
}

但是,当我尝试删除用户时,出现以下错误:

DELETE语句与REFERENCE约束“ FK_dbo.UserLogs_dbo.AspNetUsers_Customer_Id”冲突。 数据库“ MYDATABASE”的表“ dbo.UserLogs”的“ Customer_Id”列中发生了冲突。 该语句已终止。

我知道在其中放置了约束以防止数据损坏,这很好,但是我将如何删除约束以使刚好足以删除用户,然后在删除用户之后又将其重新添加?

您可以暂时禁用表的所有约束以避免错误,然后按如下所示重新启用它:

ALTER TABLE <table_name> NOCHECK CONSTRAINT ALL
--Run query here
ALTER TABLE <table_name> CHECK CONSTRAINT ALL

查看更多信息

简而言之,您遇到了麻烦。 但是有解决方法。

您不想仅仅为了删除用户而弄乱外键,但是这里存在约束是有充分理由的。 并且您要删除用户记录。

让我们看一下场景-用户注册,在您的站点上执行一些操作,生成一些日志记录,其中用户ID引用了该用户。 然后,用户确定他不再喜欢您的系统并删除其个人资料。 如果删除FK约束,然后从“用户”表中删除一条记录,然后还原约束,则将在“日志”表中获取包含UserId的记录。 但是您想查找该用户的时间缩短了2个月-您会发现该ID指向任何地方。 这使日志变得毫无用处。

因此,您的选择是:

  • 软删除-实际上不删除用户记录,而是设置一个已删除用户记录的标志,并确保所有访问Users表的系统都知道该标志并忽略软删除的记录。
  • 将用户信息非规范化为日志。 用户的日志中没有FK约束,但请保留日志中的userId,用户名(可能还有电子邮件)。 这样,您仍将知道哪个用户执行了什么操作,并且可以跟踪已删除用户的操作。 而且,当您尝试删除用户时,您无需弄乱FK。 这是我在系统中所做的事情,但我不是登录数据库,而是登录到其他无法通过FK到SQL的存储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM