1

我有2个实体,EF不删除记录流利的API - 多对多的关系

  • 新闻
  • FileAttachment的

我想利用二维码的第一流利的API,因此配置每个新闻可以有0,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(附件);它正确添加附件& NewsAttachment表中的记录。

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

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

感谢, 阿米特

编辑

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

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

回答

0

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

。在你的NewsAttachment之间没有直接的“FK”的关系,因为它通过一个连接表。因此你不能指望如果新闻确实需要删除附件 - 因为附件可能有其他相关消息。

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

也就是说,如果你的结构允许不明确创建多到很多(不要把收集的两侧,或用流利的配置类似)。

在你的情况提供您的“附件” News之间不能重复使用的 - 然后就放在News集合导航属性 - 离开附件W/O任何 - 或者是让一个“FK”,单一实例导航从附件(如“父母”),如果你需要它。

另一方面,如果attach...可以通过不同的 news记录的父对象 - 那么你不应该有级联删除反正。

注:检查产生迁移脚本 - 或SQL/DB - 看看到底是什么创造 - 并确保没有创建中间表 - 只有一个“FK”从“固定”到会并'新闻'。

编辑:

modelBuilder.Entity<News>() 
    .HasMany(c => c.Attachments) 
    .WithOptional() // or WithRequired (test to see which is better for you) 
    .WillCascadeOnDelete(true); 

...并在新闻做出一个public ICollection<FileAttachment> Attachments {get;set;}
(实际上收集属性是所有你需要的 - 但配置是安全的,你得到你想要的)

这会让你一对多(或多对一),这是您的数据的性质(如您在评论中所述) - 您可以进行级联删除。

+0

嘿,谢谢你的回应。我的问题是,当我从新闻中删除与附件的关系时,仍然可以保留中间表并仍然删除附件?我知道它在技术上可能是不正确的,但根据我的架构,我知道单个附件记录将通过中间表与唯一的一个实体关联。 如果这是不可能的,你可以建议没有中间表的任何其他配置,从附件表中删除记录? –

+0

嗨艾米特 - **不可能** - 对于我所知道并见过的所有人。看看我的编辑做什么 - 这是唯一的方法 - 我认为它“符合”你想要的。 – NSGaga

+0

谢谢@NSGaga,在我的情况FileAttachment存储文件为各种目的。我有博客实体,也有附件。两个中间表BlogAttachments&FileAttachments。 现在,如果我使用WithOptional,因为你建议(我不能使用WithRequired),因为我需要FileIttachment表中的BlogId和NewsId),我可以摆脱中间表,但仍然不删除记录从FileAttachment表,它只是使NewsId/BlogId NULL。任何建议? 主要的是我不想与FileAttachment表中的所有字段创建单独的表。 –