實體框架:使用分離的對象和附加的對象

c# entity-framework

首先,讓我列出我想做的事情。假設我有三種類型的EntityObjectMetaDataData1Data2 。正如人們所料, MetaData具有對Data1Data2各一個實例的引用。現在,對於每個MetaData ,我可以計算一個value

到目前為止這麼簡單。現在,我希望用戶可以使用Data1Data2各種組合,並查看它們可以獲得的value 。這顯然需要創建MetaData實例。現在,如果我不想用MetaData所有這些條目來填充數據庫,那麼我想在內存中創建實體對象而不調用SaveChanges()將其寫回到DB。但是,這會產生一個問題,即每當我嘗試訪問內存中MetaDataData1Data2引用時,我最終會MetaData以下異常:

InvalidOperationException未處理

當相關對象處於添加狀態或分離狀態且最初未使用NoTracking合併選項檢索時,無法返回此EntityCollection或EntityReference的源查詢。

如果我按照建議做,並將對象“提交”到DB,我最終會遇到混亂問題。

無論如何,有罪的代碼看起來像這樣:

MetaData temp = MetaData.CreateMetaData(0);

MetaData.Data1 = <existing Data1 from context>;
MetaData.Data2 = <existing Data2 from context>;

//Exception here
if (!MetaData.Data1Reference.isLoaded)
    MetaData.Data1Reference.Load();

看來這傢伙有類似的問題。

一般承認的答案

IsLoaded僅與已從數據庫實現的實例的屬性相關。正如您所發現的那樣,它不會返回尚未從數據庫中實現的實例的有用信息。

因此,您應該更改測試是否要調用Load()的方式。如果您知道您將使用僅在內存中創建但未在數據庫中實現的MetaData實例,那麼您可以編寫如下代碼:

if ((temp.EntityState != System.Data.EntityState.Added) && 
    (!temp.Data1Reference.IsLoaded)) temp.Data1Reference.Load();

我在這裡掩飾一些細微之處。對於初學者,EntityState使用FlagsAttribute聲明,因此它可以包含 Added而不等於 Added。此外,如果Data1Reference為非null,則不需要這樣做,因此您可能只想先測試它。關鍵是,您可以編寫適合您情況的代碼,但它必須考慮完整的temp狀態,而不僅僅是其屬性。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因