EF不会删除Fluent API的记录 - 多对多关系

时间:2013-04-12 14:15:17

标签: entity-framework ef-code-first code-first fluent-interface ef-migrations

我有2个实体,

  • 新闻
  • FileAttachment的

我想使用代码优先的流畅API进行配置,以便每条新闻可以包含0,1或多于1个附件。

这是我现在正在使用的

   public NewsMap()
    {
        this.ToTable("News"); // Table Name
        this.HasKey(m => m.Id); // Primary Key

        // Field Definition            
        this.Property(m => m.Title).HasMaxLength(255).IsRequired();
        this.Property(m => m.Body).HasColumnType("Text").IsRequired();
        this.Property(m => m.Summary).HasMaxLength(1000).IsRequired();
        this.Property(m => m.AuthorId).IsRequired();

        this.Property(m => m.CreatedOn).IsRequired();
        this.Property(m => m.UpdatedOn).IsRequired();

        this.HasMany(m => m.Attachments).WithMany().Map(m => m.MapLeftKey("NewsId").MapRightKey("AttachmentId"));
    }

public class FileAttachmentMap : EntityTypeConfiguration<FileAttachment>
{
    public FileAttachmentMap()
    {
        this.ToTable("FileAttachments"); // Table Name
        this.HasKey(m => m.Id); // Primary Key

        // Field Definition            
        this.Property(m => m.DisplayName).HasMaxLength(256).IsRequired();
        this.Property(m => m.PhysicalFileName).HasMaxLength(256).IsRequired();
        this.Property(m => m.Extension).HasMaxLength(50).IsRequired();
        this.Property(m => m.IsImage).IsRequired();
        this.Property(m => m.ThumbTiny).HasMaxLength(275).IsOptional();
        this.Property(m => m.ThumbSmall).HasMaxLength(275).IsOptional();
        this.Property(m => m.ThumbMid).HasMaxLength(275).IsOptional();
        this.Property(m => m.ByteSize).IsRequired();
        this.Property(m => m.StorageType).IsRequired();   

        this.Property(m => m.CreatedOn).IsRequired();
        this.Property(m => m.UpdatedOn).IsRequired();
    }
}

此映射正确生成一个名为NewsFileAttachment的中间表,其中包含两个字段:

  • NewSID的
  • 附件ID

当我呼叫News.Attachments.Add(附件)时,在新闻实体上;它正确地在附件和附件中添加记录。新闻附件表。

当我从News.Attachments中删除一些列表项时,它正确地从NewsAttachment表中删除记录,但它不会删除FileAttachment表中的记录。我也想删除它。

有人可以建议更好的Fluent API配置来实现这一目标吗?

谢谢, 阿米特

修改

在我的情况下,FileAttachment存储用于各种目的的文件。我也有博客实体也有附件。那么,两个中间表BlogAttachments&amp; FileAttachments。现在,如果我使用WithOptional(我不能使用WithRequired,因为我需要在FileAttachment表中使用BlogId&amp; NewsId),我可以摆脱中间表,但仍然删除不会从FileAttachment表中删除记录,它只是使NewsId / BlogId为NULL。

有什么建议吗?主要的是我不想用FileAttachment表中的所有字段创建单独的表。

1 个答案:

答案 0 :(得分:0)

这是预期的 - 因为它创建了多对多和额外的表 - 级联仅适用于该表。

  

NewsAttachment之间没有直接的'FK'关系   News,因为它通过连接表。因此你不能期望例如要删除的附件,如果新闻有 - 因为附件可能有与之相关的其他新闻。

另见这一点 - 它有点相关。
One to Many Relationship with Join Table using EF Code First

即。如果你的结构允许没有明确地创建多对多(不要在两边放置集合,或者在流畅的配置中使用类似的集合)。

在您的情况下提供“附件”不能在News 之间重复使用 - 然后只需在attach...中添加一个集合导航属性 - 并保留附件没有任何 - 或者如果你需要的话,从附件(如'父')创建一个'FK'单例导航。

  

另一方面,如果news可能是不同的父级   modelBuilder.Entity<News>() .HasMany(c => c.Attachments) .WithOptional() // or WithRequired (test to see which is better for you) .WillCascadeOnDelete(true); 记录 - 然后你不应该有级联删除。

注意:检查生成的迁移脚本 - 或SQL / Db - 以确切了解它创建的内容 - 并确保没有创建中间表 - 并且只有一个'FK'来自'附件'到'新闻'。

编辑

public ICollection<FileAttachment> Attachments {get;set;}

...并在新闻中制作一个{{1}} (实际上,集合属性就是你所需要的 - 但配置是安全的,你得到你想要的东西)

这会让你成为一对多(或多对一),这是你数据的本质(正如你在评论中所说的那样) - 你可以进行级联删除。