0

我有这门课(简体)

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。

我对这个领域的流利的 API:

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

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

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

4

1 回答 1

1

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

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

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

Section s = context.Sections.Include(s => s.DepartmentMembers).First();
context.Delete(s);
context.SaveChanges();
于 2012-10-24T10:21:13.913 回答