【问题标题】:Foreign key problem in ASP.NET MVC using C# when I try to delete a database entry当我尝试删除数据库条目时,使用 C# 的 ASP.NET MVC 中的外键问题
【发布时间】:2020-02-02 18:20:10
【问题描述】:

我是 ASP.NET MVC 和 C# 的新手,也许你可以帮助我。

我已经连接到我的数据库并且我已经有一个SEC_Users 表的控制器。我的问题是我们的数据库有很多带有很多外键的表。所以我们的用户连接到很多其他表(项目只是我学习的一种解决方法)。

现在我的问题是我无法删除用户,因为他连接到其他表,我需要先删除这些条目。我开始一个接一个地删除表。但现在我有点卡住了。

用户在表SEC_LoginToken 中有一些条目,我需要将其删除。这可行,但我还需要删除表SEC_RefreshToken 中的条目,该条目通过token 列与SEC_LoginToken 连接。而且我不知道如何删除SEC_RefreshToken 表中的这些条目。

对不起我的英语,希望你能理解我的问题。

因此,为了删除其他表中的所有条目,我从用户那里获取 id 并查看是否有具有该用户 ID 的条目,如果有,我将其删除。我试图从SEC_LoginToken 中取出token 列,我想在其中删除行并将其保存到列表中。然后我想说,对于列表中的每个条目,应该删除SEC_RefreshToken 中的列token 相同的行。但它不起作用。有没有更好的方法?还是我做错了什么?

您在这里看到我的控制器的 DELETE(功能?):

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    // Löschen aller Einträge des Users in der DAT_UserDetail
    foreach (var ec in db.DAT_UserDetail.Where(x => x.UserID == id))
        db.DAT_UserDetail.Remove(ec);

    // Löschen aller Einträge des Users in der SEC_ObjectAccessRight
    foreach (var ec in db.SEC_ObjectAccessRight.Where(x => x.UserID == id))
        db.SEC_ObjectAccessRight.Remove(ec);

    // Löschen aller Einträge des Users in der SEC_UserGroupFunction_User
    foreach (var ec in db.SEC_UserGroupFunction_User.Where(x => x.UserID == id))
        db.SEC_UserGroupFunction_User.Remove(ec);

    //-----------------------------------------------------------------------
    List<string> token = new List<string>();

    foreach (char ec in db.SEC_LoginToken.Where(x => x.UserID == id)
        .Select(x => x.Token)
        .Single())
        token.Add(ec.ToString());

    foreach (string row in token)
    {
        // db.SEC_RefreshToken.Remove(token);
        db.SEC_RefreshToken.RemoveRange(db.SEC_RefreshToken.Where(x => x.Token == row));
        db.SaveChanges();
    }

    //-----------------------------------------------------------------------

    // Löschen aller Einträge des Users in der SEC_LoginToken
    foreach (var ec in db.SEC_LoginToken.Where(x => x.UserID == id))
        db.SEC_LoginToken.Remove(ec);

    // Löschen des Users
    SEC_User sEC_User = db.SEC_User.Find(id);
    db.SEC_User.Remove(sEC_User);

    db.SaveChanges();

    return RedirectToAction("Index");
}

我只想点击删除按钮而不出现错误:序列包含多个元素。它发生在我编码的地方

foreach (char ec in db.SEC_LoginToken.Where(x => x.UserID == id).Select(x => x.Token).Single())

提前非常感谢!

【问题讨论】:

  • First()代替Single()?
  • 我会说一起删除Single(),因为您想遍历用户的每个令牌,而不仅仅是一个。
  • 我认为您应该首先从最后一个表中删除,或者不产生错误的表然后是后续表。此外,在您的 foreach 循环之后,您可能需要在继续进行另一个循环之前保存更改。

标签: c# visual-studio entity-framework model-view-controller foreign-keys


【解决方案1】:

错误'序列包含多个元素'的发生是因为

db.SEC_LoginToken.Where(x => x.UserID == id).Select(x => x.Token).Single()

返回多个元素。在这种情况下,这意味着对于 x.UserID == id,存在 SEC_LoginTokenCollection。您应该将其更改为:

foreach (string ec in db.SEC_LoginToken.Where(x => x.UserID == id)
            .Select(x => x.Token)
            .ToList())

另外,您是否考虑过使用逻辑/软删除?这将解决您所有的级联删除问题,并且您将拥有可供审核的历史记录。

【讨论】:

  • 您好 Leandro,非常感谢您的回复!现在我了解了我的问题,我像您一样更改为 foreach 循环,并且需要更改列表的类型,现在它可以工作了。还要感谢您提到“逻辑/软删除”。我以前没听说过,但我会去看看!最好的问候
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多