【问题标题】:How can I delete all records associated with a "User"?如何删除与“用户”关联的所有记录?
【发布时间】:2026-02-02 16:45:01
【问题描述】:

我正在使用实体框架和默认的 ASP.NET 成员服务。我还有第三张表用于“个人资料信息”。我认为 EF 会在内部处理所有这些,但事实并非如此。当我尝试通过访问http://localhost:19506/User/Delete/SomeGUIDhere 之类的 URL 来删除用户时,我收到了一些与存在外键约束相关的严重错误。

如何管理这些类型的依赖关系?必须跟踪所有这些都违背了 EF 的目的,所以我猜我错过了一些小事。

EDIT 包括一些我正在工作的代码。我仍然想知道是否有比我下面的更好的方法。看起来它会很快失去控制,有很多外键依赖项四处飘荡。

public void DeleteUser(User u)
{
    db.Profiles.DeleteObject(u.Profile);
    db.aspnet_Membership.DeleteObject(u.aspnet_Membership);
    db.Users.DeleteObject(u);
    db.SaveChanges();
}

【问题讨论】:

    标签: entity-framework asp.net-mvc-3


    【解决方案1】:

    这些类型的依赖关系如何 管理?必须跟踪它 一切都违背了EF的目的 所以我猜我错过了什么 次要的。

    不幸的是,这仍然是一个手动过程,正如@Danny Varod 指出的那样,有两个方面:

    1. 在您的数据库中,假设外键关系已经建立,请确保选择条件“删除时-> 级联”。您可以在 SQL Server Management Studio 中更改此设置。

    2. 在您的 EF 实体模型中,您还应该在关系上指定此选项。为此,只需选择表示关系的实体之间的虚线。 In the properties you will see the appropriate option for "Cascading Delete" - you should pick delete for the End that has the 1 and not the *.

    【讨论】:

    • 看起来很简单。在您的屏幕截图中,突出显示的部分是否意味着当您删除帖子时,所有相关联的 cmets 都会随之出现?在我的问题中,我有一个 1:1 的用户:个人资料。当我删除一个用户时,我希望配置文件也可以删除,但如果用户没有被删除,我不希望能够意外删除配置文件。
    • @Pete:是的,您的陈述是正确的-实际上是在检查此问题时-假设您首先执行数据库,EF 应该从数据库中获取级联删除-确保您在那里进行设置,从您的模型中删除实体,并通过“从数据库更新”重新添加它 - 然后它应该添加级联删除 - 请稍后在您的模型中重新确认。另请查看这篇文章:blogs.msdn.com/b/alexj/archive/2009/08/19/…
    【解决方案2】:

    概念模型(和数据库)关系的级联删除。

    【讨论】:

    • 如果我知道如何在我的实体模型和数据库上使用级联删除,我就不会发布这个问题了。你至少有一些关于如何重写我的代码而不必担心依赖关系的伪代码吗?
    • 我相信你可以改变关系,将删除类型设置为级联
    • 在 edmx 设计中,选择关系,在属性工具窗口中,将 End1/2 On Delete 更改为 Cascade。