EF Code首先级联删除外键一对多

Posted

技术标签:

【中文标题】EF Code首先级联删除外键一对多【英文标题】:EF Code first cascade delete on foreign key one-to-many 【发布时间】:2013-02-15 15:39:04 【问题描述】:

我们首先在实体框架代码中工作

我们有一个课堂视频

class Video
   List<ImageInfo> Images
      get; set;
   

我们的图像信息类包含图像的路径和一些其他信息

class ImageInfo
    String path;
    ...

我们希望 EF 在删除视频时删除图像信息

所以我们改变了模型构建器如下:

modelBuilder
    .Entity<Video>()
    .HasMany(v => v.Images)
    .WithRequired()
    .WillCascadeOnDelete(true);

我们不想在我们的 imageinfo 类中添加指向视频的链接。

是否可以在没有 2 路外键的情况下获得级联删除功能?

编辑

保存视频时,imageInfo的video_id没有填入数据库。

http://pbrd.co/14X82vb

我们如何解决这个问题?

我不知道它是否相关,但是当我们同时添加一个带有图像的新视频时,我们会得到这个错误:

Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.

【问题讨论】:

【参考方案1】:

WithRequired 引入了 2 路关系。因此,您应该执行以下操作。

modelBuilder
    .Entity<Video>()
    .HasMany(v => v.Imgages)
    .WithOptional()
    .WillCascadeOnDelete(true);

...并假设您希望这种关系反过来...

public class Video  
public class ImageInfo 
    public virtual Video  get; set; 


modelBuilder
    .Entity<ImageInfo>()
    .HasRequired(v => v.Video)
    .WithMany()
    .WillCascadeOnDelete(true);

PS:我认为List&lt;ImageInfo&gt; 应该是virtual,所以这是我的定义...

public class Video 
    public Video()  this.Images = new List<ImageInfo>(); 
    public virtual ICollection<ImageInfo> Images  get; set; 

【讨论】:

像魅力一样工作。我们还有第二个问题。我们为 Images 属性分配了一个新列表,导致数据库同步失败。因此,我们学会了永远不要为属性分配新列表。 (类似于 observableCollection 和数据绑定) 届时将不胜感激接受答案:-)。此外,它还有助于提高您自己的声誉,从而获得更多/更好的答案。 我们仍然有删除视频时级联图像的问题:请参阅原始问题(已编辑部分)

以上是关于EF Code首先级联删除外键一对多的主要内容,如果未能解决你的问题,请参考以下文章

使用共享主键关联时,EF 4.1 Code First 中的级联删除规则

EF-CodeFirst-3搞事

NHibernate 级联删除不适用于一对多关联

EF-CodeFirst-3搞事

SQL 怎么级联删除语句

SQL 怎么级联删除语句