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表中的所有字段創建單獨的表。 –

相關問題