Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MVC中使用C#删除数据库项时出现的外键问题_C#_Visual Studio_Entity Framework_Model View Controller_Foreign Keys - Fatal编程技术网

ASP.NET MVC中使用C#删除数据库项时出现的外键问题

ASP.NET MVC中使用C#删除数据库项时出现的外键问题,c#,visual-studio,entity-framework,model-view-controller,foreign-keys,C#,Visual Studio,Entity Framework,Model View Controller,Foreign Keys,我对ASP.NET MVC和C#都是新手,也许你能帮我 我已经连接到我的数据库,并且我已经有了一个SEC_用户表的控制器。我的问题是,我们的数据库有很多表和很多外键。所以我们的用户连接到许多其他表(project只是我学习的一个变通方法) 现在我有一个问题,我不能删除用户,因为他连接到其他表,我需要先删除这些条目。我开始一个接一个地删除表。但现在我有点困了 用户在表SEC_LoginToken中有一些条目,我需要删除这些条目。这是可行的,但我还需要删除表SEC\u RefreshToken中的条

我对ASP.NET MVC和C#都是新手,也许你能帮我

我已经连接到我的数据库,并且我已经有了一个
SEC_用户
表的控制器。我的问题是,我们的数据库有很多表和很多外键。所以我们的用户连接到许多其他表(project只是我学习的一个变通方法)

现在我有一个问题,我不能删除用户,因为他连接到其他表,我需要先删除这些条目。我开始一个接一个地删除表。但现在我有点困了

用户在表
SEC_LoginToken
中有一些条目,我需要删除这些条目。这是可行的,但我还需要删除表
SEC\u RefreshToken
中的条目,该表通过列
token
连接到
SEC\u LoginToken
。我不知道如何删除
SEC\u RefreshToken
表中的条目

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

因此,为了删除其他表中的所有条目,我从用户那里获取id,看看是否有一个条目具有该用户id,如果是,我将其删除。我试图从
SEC\u LoginToken
中获取
token
列,在那里我要删除行并将其保存到列表中。然后我想说的是,对于列表中的每个条目,
SEC_refreshttoken
中列
token
相同的行应该被删除。但它不起作用。有没有更好的办法?或者我做错了什么

这里您可以看到我的控制器的删除(功能?):

[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");
}
提前多谢

发生错误“序列包含多个元素”是因为

db.SEC_LoginToken.Where(x => x.UserID == id).Select(x => x.Token).Single()
返回多个元素。在这种情况下,这意味着对于
x.UserID==id
,存在一个
集合
secu\LoginToken
。您应该将其更改为:

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

在其他注释中,您是否考虑使用逻辑/软删除?这将解决所有级联删除问题,并且您将拥有审核历史。

使用
First()
而不是
Single()
?我建议删除
Single()
由于您希望迭代用户的每个令牌,而不仅仅是一个令牌,所以应首先从最后一个表或不会产生错误的表中删除,然后再从后面的表中删除。同样,在foreach循环之后,您可能需要在继续另一个循环之前保存更改。嗨,Leandro,非常感谢您的回复!现在我理解了我的问题,我像您一样更改为foreach循环,需要更改列表的类型,现在它可以工作了。同时也感谢您提到“逻辑/软删除”。我以前没有听说过,但我会去看看的!顺致敬意,
foreach (string ec in db.SEC_LoginToken.Where(x => x.UserID == id)
            .Select(x => x.Token)
            .ToList())