2013-10-11 38 views
0

我正在創作一個域模型,我稍後將使用EF Code First映射到數據庫。這是我第一個使用Entity Framework的項目,儘管我已經閱讀了一本關於它的書,但我不記得它是如何工作的所有細節。我可以在保存更改之前查詢修改的對象嗎?

在領域模型的一部分,我有一對多的關係。

public class Parent 
{ 
    public IList<Child> Children { get; private set; } 
} 

用戶之後改性的Parent在內存中的實例,並點擊一個按鈕,那麼這將是時間給該實例持久化到數據庫中。那時,我必須首先在數據庫中存在的實例(保存之前)和存儲器中未保存的修改版本之間運行一些特定於域的比較邏輯。所以我需要查詢數據庫以檢索Parent實例及其Children的未修改副本。

EF代碼首先讓我安全地運行這樣的查詢嗎?我只是擔心,當EF運行這樣的查詢時,它會看到每個Child已經在內存中,因此重用這些實例並覆蓋它們的修改,而不是實例化重複項。在這種情況下,我實際上想要複製品。

+0

如何獲取內存中的實例?最主要的是,如果它沒有被EntityChangeTracker跟蹤,那麼你需要「附加」它並將其狀態標記爲「已修改」,以便當你在上下文中調用SaveChanges時,它可以知道它需要更新。如果你進行查詢,它將被跟蹤,但如果你只是「附加」,它也將被跟蹤,並且需要更少的時間。 – jannagy02

回答

0

代碼首先,您可以訪問跟蹤對象的原始和改變的值是這樣的:

Parent parent; 
... 
var curVal = context.Entry(parent).Property(p => p.Property).CurrentValue; 
var origVal = context.Entry(parent).Property(p => p.Property).OriginalValue; 

你也應該能夠Children集合中的單獨的值要做到這一點

隨後的查詢將提供一組具有當前數據庫值的實體,但是如果您想檢查上下文保存的緩存,那麼這是非常簡單的,如下所述:

http://weblogs.asp.net/ricardoperes/archive/2012/03/19/entity-framework-code-first-get-entities-from-local-cache-or-the-database.aspx

+0

這段代碼可以幫助我看到事物,但讓我們回到我的問題:如果在實例被修改之後但在它們被保存之前運行查詢,該查詢(a)是否會返回一組全新的實例,(b)更新從數據庫中讀取內存中的「原始」值而不覆蓋「當前」值,或者(c)導致我丟失修改後的值。 – HappyNomad

+0

我已編輯回覆以包含有關此信息 –

相關問題