2013-10-22 40 views
1
產生的實體框架6不工作

我已經使用舊版本的實體框架很長一段時間的項目,但我需要更新數據庫模式(使用數據庫第一次),因此Visual當我更改EDMX文件時,Studio 2013決定將我升級到EF 5(我現在已升級到EF 6)。延遲加載從EDMX

在我之前使用它的實體框架中,延遲加載看起來並不奏效,但我可以在集合或對象上調用.Load(),然後從數據庫加載它。

例如,這將在老EF工作:

public ICollection<CategoryItem> LoadedCategoryItems 
{ 
     get 
     { 
    CategoryItems.Load(); 
     return CategoryItems; 
     } 
} 

在EF 5/6,CategoryItems將有計數爲0,所以延遲加載從未似乎工作:

public ICollection<CategoryItem> LoadedCategoryItems 
{ 
    get 
    { 
     return CategoryItems; 
    } 
} 

這似乎沒有辦法強制加載除了做這樣的事情:

database.CategoryItems.Load(); 

它可以通過預加載它不知怎麼的,但我有很多在我的數據庫中的許多關係,我無法弄清楚如何以這種方式預加載,所以現在我非常卡住,無法再往前走。

至於類的代碼通過由EDMX文件創建的T4模板生成,這是絕對虛擬:

public virtual HashSet<CategoryItem> CategoryItems { get; set; } 

包含該對象的類是一個動態代理,和遲緩裝載上。

所以我不清楚爲什麼延遲加載不工作或如何調試它,找出爲什麼它是不是?

我怎麼能弄清楚到底是怎麼回事?

謝謝, 斯蒂芬

+1

爲什麼你認爲延遲加載不起作用?你在哪裏訪問CategoryItems? (LazyLoading意味着它會在你使用它的時候加載數據 - 因此對於需要加載的CategoryItems,你需要調用它的獲取 - 你是否在訪問它,而不是顯示這部分代碼) –

+0

當我嘗試訪問它時,在for循環中說,列表中沒有項目。 另一個示例是: public Image LoadedImage { get { return Image; } } 下面是由EDMX生成的代碼: public virtual Image Image {private get;組; } 當試圖訪問圖像(即:使用get),它崩潰,因爲它是空的。 但是,如果初始化應用程序時,我這樣做: database.Images.Load(); 它的工作原理,這意味着延遲加載不起作用。 – Stefan

+1

你做錯了什麼,我沒有問題與EF 6中的LazyLoading,當我不要忽略要設置爲惰性加載工作,我希望你有他們設置的要求。 http://msdn.microsoft。com/en-us/library/vstudio/dd468057(v = vs.100).aspx特別是您可以檢查點「ProxyCreationEnabled選項必須設置爲true」。 –

回答

0

由於歷史的原因(預延遲加載)一些EDMX生成的代碼使用的私有吸氣劑。現在你不能使用延遲加載,所以這些都必須改爲公共獲得者