C# 实体框架FK在级联删除时未更新
我目前正在使用EntityFramework5,这是一个相当简单的问题。我有两种类型,都有收件人作为参考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;
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(真);