我目前正在使用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上实际(并明确地)声明外键属性。
答案 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);