2010-03-12 85 views
0

UPDATE:從我聽到的情況來看,我想象的是我在下面描述的問題。所以,這幾乎不是問題。未來的讀者,繼續前進...在這裏沒有什麼可看的。如何阻止自動生成的Linq to SQL類加載所有數據?


我有一個ASP.NET MVC項目,很像NerdDinner教程示例。 (我使用MVC 2,但爲了創建它,遵循NerdDinner教程)。

根據本教程的part 3中的說明,我通過創建一個「Linq to SQL Classes」(.dbml)表面並將我的數據庫表放到它上面來創建了我的數據庫的Linq-to-SQL模型。設計者根據我的數據庫表自動添加生成的類之間的關係。假設我的類是根據NerdDinner示例的,所以我有Dinner和RSVP表,每個Dinner記錄都與許多RSVP記錄相關聯 - 因此在生成的類中,Dinner對象具有RSVPs屬性,它是一個RSVP對象列表。

我的問題是這樣的:它出現(和我會很樂意被證明是錯誤的這一點),一旦我 訪問Dinner對象,它加載所有相應的RSVP對象,即使我請勿使用RSVPs會員。

第一個問題:這真的是生成的類的默認行爲嗎?

在我的特殊情況下,對象圖包含更多的表(它的數量級更多的記錄),所以這是災難性的行爲 - 當我想要做的就是顯示數據時,我會加載大量數據單親記錄的細節。

第二個問題:是否有通過設計器UI公開的任何屬性,讓我修改此行爲? (我找不到)。

第三個問題:我已經看到了如何通過使用帶有DataContext的相關的DataShape對象控制在DataContext相關記錄加載的描述。那是我要做的事情嗎?如果有的話,是否有像NerdDinner這樣的教程不僅會展示如何去做,還會爲正常使用提供一個「模式」?

+0

「看來(和我會很樂意被證明是錯誤的這一點),一旦我訪問■裝載所有相應的RSVP對象的」 這是什麼意思?您是否檢查分析器,RSVP SQL是否正在運行?它是否返回行? – jfar 2010-03-12 14:43:16

+0

我在調試器中檢查了Dinner對象,並深入到RSVPs成員中,該成員似乎已經填充。也許這是事實,我在調試器中查看它導致它被填充?有一種簡單的方法可以告訴嗎? – 2010-03-12 14:46:22

+1

那就是Gary的情況。你檢查它,你加載它。 – jfar 2010-03-12 14:52:07

回答

1

當您有1:M關係時,L2S代碼生成器將爲單個實體生成一個實體類,並在實體中包含一個實體子對象集。當您檢索單個(父)實體時,在嘗試以某種方式訪問​​子對象集合之前,L2S將不會檢索子對象。這被稱爲延遲加載。我知道,沒有辦法阻止L2S檢索子對象,除了從不試圖訪問子對象的集合。但是請注意,如果您從不訪問子集合,L2S將不會檢索子行。因此,由於您的應用程序正在檢索子行,因此您必須以某種方式訪問​​該集合。

您還可以在嘗試訪問集合之前讓L2S自動檢索子對象來執行所謂的「急切加載」。但是,這聽起來不像是你想要做的。

+0

所以你說我不應該看到這種行爲? (事實上​​,我可能不會 - 看到我對jfar評論的回答)。 – 2010-03-12 14:47:28

+0

正確。如果您訪問集合,即使在調試器中,您也將加載該集合。 – 2010-03-12 15:04:22