C# 实体框架FK在级联删除时未更新

C# 实体框架FK在级联删除时未更新,c#,database,entity-framework-5,C#,Database,Entity Framework 5,我目前正在使用EntityFramework5,这是一个相当简单的问题。我有两种类型,都有收件人作为参考 public File() : base() { this.Preview = FilePreview.None; this.Recipients = new HashSet<SharedFileRecipient>(); } public Folder() : base() { this.Preview = FilePreview.None;

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

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

public Folder() : base()
{
    this.Preview = FilePreview.None;
    this.Recipients = new HashSet<SharedFileRecipient>();
}
public File():base()
{
this.Preview=FilePreview.None;
this.Recipients=new HashSet();
}
公用文件夹():基()
{
this.Preview=FilePreview.None;
this.Recipients=new HashSet();
}
SharedFileRecipient只是一个具有一些属性的常规C#类,并且不指定对文件或文件夹的引用

在数据库中,EF映射了所有这些细节,包括向dbo.SharedFileRecipients表添加两个可为空的FK(File_Id和Folder_Id),该表指向dbo.File或dbo.Folder

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

DELETE语句与引用约束“FK_dbo.SharedFileRecipient_dbo.Folder_Folder_Id”冲突

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

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


我已经读了很多关于使用fluentapi设置它的文章,但我认为这不适用于我非常简单的模型在SharedFileRecipient上声明外键属性。

您必须从数据库中加载相关的
收件人。
无论您是通过急切加载、延迟加载还是显式加载来执行此操作。加载子项并将其附加到上下文后,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);
modelBuilder.Entity()
.HasMany(f=>f.Recipients)
.WithOptional()
.WillCascadeOnDelete(真);