簡體   English   中英

使用實體框架(代碼優先)將具有可空關聯的實體更新/更改為null

[英]Using Entity Framework (Code First) to update/change an entity with a nullable association to null

我有一個關聯(虛擬的,延遲加載的一對一或空值),我想將其設置為null。 我發現除非首先加載此關聯, 然后將其設置為null, 否則這是不可能的。

someEntity.AnotherEntity.ToString(); // Needs to be done in order to force a load since im using a service that wraps a generic repository
someEntity.AnotherEntity = null; // Now this works because i loaded above.

我在Google上搜索了很多東西,似乎很想加載someEntity是一個選擇,或者向SomeEntity添加一個新屬性,即:

[ForeignKey("AnotherEntity")] // With this annotation
int? AnotherEntity_Id // Added this property

然后使用可為null的AnotherEntityId代替關聯屬性AnotherEntity

我現在使用第二種方法,它使Entity有點膨脹,但看起來更加牢固,因為您也不需要額外的SQL調用。

  1. 為什么我不能將關聯設置為null並讓EF理解這一點?

  2. 那我使用的第二種方法呢? 這是一個好習慣還是有更好的選擇?

1為什么我不能將關聯設置為null並使EF理解這一點?

這是因為您的實體的性質啟用了延遲加載。 對於延遲加載,直到您在Navigation屬性上調用get方法,該實體才會在該屬性中實現。 如果調用set ,請確保這可以將屬性的后備字段設置為null,但是EF會忽略它,因為開始時它為null。 除非您渴望加載,否則在調用get之前,不會填充該屬性的后備字段。

2我使用的第二種方法呢? 這是一個好習慣還是有更好的選擇?

一個簡單的解決方法是通過執行以下操作來強制延遲加載(如果尚未加載):

if (someEntity.AnotherEntity != null) // this will lazy load the instance
    someEntity.AnotherEntity = null; // now tell EF to remove the association

if塊中的語句將在屬性上調用get方法,並在尚未急於加載時延遲加載它。 現在,EF上下文知道該實體已被跟蹤,因此當您在下一行將其設置為null時,EF將記住您想在保存更改時將其清空。

另外,正如您指出的那樣,如果要為關聯公開可空的外鍵屬性,則可以對其進行設置。 由於它不是虛擬的,因此將其更改為null也將具有與告訴EF上下文您要刪除關聯的效果相同的效果。

暫無
暫無

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

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