2011-03-02 18 views
0

我有兩個表(數據庫中有更多,但只涉及兩個表)。
賬戶和賬戶狀態,賬戶可以有一個賬戶狀態(活動,不活動等)。爲什麼實體框架在設置屬性時從數據庫加載數據?

我創建一個新帳戶,並設置一些屬性,但是當我到達這個代碼:
1. VAR狀態= db.AccountStatuses.SingleOrDefault(S => s.ID ==(長)AccountStatusEnum.Active) ;
2. account.AccountStatus = status;
3. db.Accounts.AddObject(account);
第一行執行得很好,但是當我到達第二行時,需要很長時間,當我進入代碼時,似乎每個帳戶都從數據庫加載。

我不明白爲什麼它甚至要加載所有帳戶?
我們使用Entity Framework 4和Poco,並且啓用了延遲加載。

有什麼建議嗎?
乾杯
/吉米

+1

你能告訴帳戶創建的整個代碼? – 2011-03-02 16:09:23

+0

創建賬戶並不是那麼壯觀;) 這些是上面貼出的代碼之前的行。 var account = new Account(); account.SourceSystemClientID =「」; account.AccountNumber =「...」; account.ModificationDate = DateTime.Now; account.LastModifiedBy =「客戶」; account.CreationDate = DateTime.Now; – 2011-03-02 18:49:16

回答

2

你必須要小心,它構造使用來獲取數據,因爲有些人會在整個集和過濾後記拉。 (另外:長時間延遲可能是數據庫正在創建和播種,如果沒有已經存在的數據庫,它會在您第一次觸摸它時發生,可能會出現某種查詢。還要記住,當您檢索整個數據庫時數據集,實際上你可能只有相當於一個編譯後的查詢,在你與之交互之前不會被評估)。

嘗試這種形式代替,看看你是否有同樣的問題:

var status = db.AccountStatuses.Where(s => s.ID == (long)AccountStatusEnum.Active); 
+0

阻止這些類型的問題感到驚訝(更多的數據被加載比你預期的更多)的一個好方法是禁用延遲加載 - 只有你明確加載的東西纔會被加載。 – 2011-03-02 17:28:20

+0

但是,因爲我設置了AccountStatus屬性,它的加載(我認爲是所有帳戶,我沒有實際驗證它是所有帳戶)並不奇怪嗎? – 2011-03-02 18:53:42

+0

我最終放棄了在我通過指定db.ContextOptions.LazyLoadingEnabled = false進行更新的上下文上的Lazyloading; – 2011-03-04 10:12:22