簡體   English   中英

防止刪除子記錄以刪除父記錄

[英]Prevent deletion of child record from deleting parent

我有一個電子郵件服務,它將電子郵件請求存儲在數據庫中(由於遺留原因)。 有兩個實體,一個EmailRequest

public class EmailRequest
    {
        [Key]
        public Guid ID { get; set; }
        public bool Sent {get; set;
        //Other props
        public virtual List<Attachment> Attachments { get; set; }
    }

和給定電子郵件的附件

public class Attachment
{
    [Key]
    public Guid Id { get; set; }
    //Other props
    public virtual EmailRequest EmailRequest { get; set;}

}

插入到數據庫中的工作正常 - 電子郵件記錄位於“父”表中,零對多附件插入附件的“子”表中。 當電子郵件發送完畢后,我想更新父表中的已發送標志並刪除任何附件,因為它們只是浪費空間。 但是,在我調用時,在我的DBContext類中

Attachments.RemoveRange(Attachments.Where(a => a.EmailRequest.ID == identifier));

所有附件都被刪除,但父(EmailRequest)也被刪除。 是什么原因引起了這個? 我已經關閉了級聯刪除,因為我正在刪除子記錄而不是父級記錄,因此我沒有做任何事情。 但是,我不知道如何告訴實體框架(6.1.3)不要刪除父代。

有任何想法嗎?

編輯

因此,正如評論中所建議的,它看起來不像EF本身正在執行刪除,因為如果我進入SSMS並從附件表中刪除,它也會刪除父項。 這里必須是實體中的東西。

編輯2

因此,如果我使用request.attachments.clear()而不是Attachments.RemoveRange()它會清除父對象(以及附件中的外鍵引用),但會保留附件,因此與我想要做的完全相反!

如果你能看到差異我首先抓住父實體然后刪除他的子集合。 您直接刪除子實體的位置。 我無法看到在這個實例中如何刪除父實體,因為它正好位於內存中供您查看。 如果它確實那么我會檢查我的數據庫約束很大的時間來查看實體框架是否添加了不需要的約束。

using (var context = new MyContext())
{
    var parent = context.Parents.Include(p => p.Children)
    .SingleOrDefault(p => p.Id == parentId);

    foreach (var child in parent.Children.ToList())
    context.Children.Remove(child);

    context.SaveChanges();
}

我希望上面的方法為您提供更多調試選項或者只是消除了問題。 我還添加了一個鏈接,讓您檢查Entity Framework生成的SQL以獲取更多調試選項(參見下文)

如何查看實體框架生成的SQL?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM