簡體   English   中英

防止實體框架將外鍵設置為NULL

[英]Prevent Entity Framework from setting foreign key to NULL

我們的數據庫具有三個實體: PersonCompanyPhoneCall

Person描述一個人。 Company描述公司。 PhoneCall描述了打給PersonCompany的電話的詳細信息。

public class Person
{
    public int Id { get; set;}
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

public class Company
{
    public int Id { get; set;}
    public string Name { get; set; }
    public string VatNumber { get; set; }
}

public class PhoneCall
{
    public int Id { get; set;}
    public string Description { get; set;}
    public int Duration { get; set;}

    public int? PersonId { get; set; }
    public Person Person { get; set; }

    public int? CompanyId { get; set; }
    public Company Company { get; set; }

}

刪除PersonCompany時,我發現Entity Framework出現某些不良行為。

如果刪除Person ,則實體框架將更新所有關聯的PhoneCall條目並將PersonId設置為NULL。

dbContext.Entry(person).State = EntityState.Deleted;
dbContext.SaveChanges();

我不希望實體框架在所有關聯的PhoneCall條目上都將PersonId設置為null,而是對實體框架拋出某種異常,以使我知道無法刪除Person因為有相關實體引用了Person

問題似乎是實體框架不尊重PhoneCall.PersonIdPhoneCall.CompanyId外鍵,因為它們都是(必須)可以為空。

我顯然可以在刪除之前執行自己的檢查,如下所示:

if (phoneCallDbSet.Where(ph => ph.Person == personToDelete).Any())
    throw new InvalidOperationException("Cannot delete person with associated calls");

...但是我的偏好是設置某種限制,以防止Entity Framework首先將外鍵設置為NULL,這樣,如果開發人員忘記執行此檢查,則最終不會PhoneCall表中的PhoneCall條目PhoneCall鏈接。

這可能嗎?

沒有!! 沒有對代碼進行顯式檢查,就無法實現所需的功能。

如果將屬性設置為可為空,則告訴框架您可以根據需要將其設置為null。 那么為什么將其設置為null時會顯示任何錯誤?

您可以使該屬性不可為空,或者在代碼中進行顯式檢查以對其進行處理。

暫無
暫無

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

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