ASP.NET MVC中使用C#删除数据库项时出现的外键问题
我对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中的条
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())