实体框架FK没有更新级联删除

时间:2014-06-09 16:25:55

标签: c# database entity-framework-5

我目前正在使用Entity Framework 5,这是一个相当简单的问题。我有两种类型的收件人作为参考。

public File() : base()
{
    this.Preview = FilePreview.None;
    this.Recipients = new HashSet<SharedFileRecipient>();
}

public Folder() : base()
{
    this.Preview = FilePreview.None;
    this.Recipients = new HashSet<SharedFileRecipient>();
}

SharedFileRecipient只是一个具有一些属性的常规C#类,并且不会将引用指定回文件或文件夹。

在数据库中,EF映射所有这些都很好,包括将两个可空的FK(File_Id和Folder_Id)添加到dbo.SharedFileRecipients表中,该表指向dbo.File或dbo.Folder。

到目前为止一切顺利,但在运行时,当我们尝试删除已共享的文件或文件夹时,数据库会抛出错误

“DELETE语句与REFERENCE约束冲突\”FK_dbo.SharedFileRecipient_dbo.Folder_Folder_Id \“。

我知道这是因为EF没有在dbo.SharedFileRecipients上运行更新,使得File_Id和Folder_Id列为null,然后继续删除父对象。

我们如何告诉EF这需要发生?而且,如果我真的想在文件/文件夹上强制级联删除,以便SharedFileRecipients在删除时消失,如何告诉EF这个?

我已经阅读了很多关于使用Fluent API进行设置的文章,但我认为这不适用于我非常简单的模型。因为我必须在SharedFileRecipient上实际(并明确地)声明外键属性。

1 个答案:

答案 0 :(得分:0)

您必须从数据库加载相关的Recipients。如果你通过热切,懒惰或显式加载来做这件事并不重要。一旦子项被加载并附加到上下文,EF将向数据库发送UPDATE语句,该数据库在删除父项时将子项的外键设置为NULL。例如,急切加载:

var file = context.Files.Include(f => f.Recipients).Single(f => f.Id == someId);
context.Files.Remove(file);

没有可以自动实现此目的的配置。关键是将相关的孩子附加到上下文中。

如果要为(可选)关系设置级联删除,可以将此配置与Fluent API一起使用:

modelBuilder.Entity<File>()
    .HasMany(f => f.Recipients)
    .WithOptional()
    .WillCascadeOnDelete(true);