【问题标题】:Removing Parent with one-to-many EntityFramework使用一对多 EntityFramework 移除父级
【发布时间】:2012-10-24 09:27:46
【问题描述】:

我有这门课(简体)

public class User {
    public string Username { get; set; }
    public virtual Section Section { get; set; }
}

public class Section {
    public int DepartmentNumber { get; set; }
    public virtual ICollection<User> DepartmentMembers { get; set; }
}

我试图实现的是删除一个部分。与此部分相关的所有用户都应该得到一个空值。由于 REFERENCE 约束“FK_Users_Sections_Section”,此剂量现在有效。

这样做的正确方法是什么?在删除之前我是否必须从该部分中删除所有用户?有没有更优雅的方法来做到这一点?我正在使用 EntityFramework。

我在这个领域的 fluent API:

modelBuilder.Entity<User>()
            .HasOptional(u => u.Section)
            .WithMany(s => s.DepartmentMembers)
            .Map(m =>
                m.MapKey("Section")
            )
            .WillCascadeOnDelete(false);

WillCascadeOnDelete 我尝试过设置为 false,删除该行并添加不带参数的行。

我想解决方案很简单,但我找不到任何好的解释(或者我可能不明白我一直在看的解释。)

【问题讨论】:

    标签: c# database sql-server-2008 entity-framework entity-relationship


    【解决方案1】:

    虽然 SQL Server 有一个用于级联删除的 SET NULL 选项,它将引用已删除记录的所有外键设置为 null,但 Entity Framework 不使用它。

    您可以自己在 SQL Server 中为约束设置此选项,也可以让 Entity Framework 通过更新加载的实体来处理它。

    如果您希望 EntityFramework 执行此操作,则需要确保已加载 DepartmentMembers 集合,以便所有需要更新的 User 对象都在上下文中。

    Section s = context.Sections.Include(s => s.DepartmentMembers).First();
    context.Delete(s);
    context.SaveChanges();
    

    【讨论】:

    • 是的,当我使用包含它的工作。正如我所料,解决方案非常简单。
    猜你喜欢
    • 2019-12-15
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多