2014-06-09 80 views
0

我目前使用实体框架5,这是一个相当简单的问题。我有两种类型的收件人作为参考。实体框架FK没有级联删除更新

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映射了所有这一切,包括向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列空进而以删除父对象之前的更新。

我们如何告诉EF这需要发生?还有,如果我真的想强制级联删除在文件/文件夹中测试,以便SharedFileRecipients在删除时将消失,如何告知EF?

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

回答

0

您必须从数据库中加载相关Recipients。无论您是通过急切,懒惰还是显式加载来执行此操作都无关紧要。一旦子元素被加载并附加到上下文中,EF将向数据库发送UPDATE语句,在删除父元素时将子元素的外键设置为NULL。例如,热切加载:

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

没有配置会自动实现此目的。关键是将相关的孩子依附于上下文。

如果你想设置级联删除的链接(可选)的关系可以用用流利的API此配置:

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