2013-04-24 80 views
4

我有一個EF5代碼優先項目,從一個大多數只讀數據庫拉,所以我使用.AsNoTracking()與絕大多數我的查詢來提高性能。EF5代碼優先:IsLoaded和.AsNoTracking()

我很好奇,雖然我有很多的導航性能的,有時它會是有用的知道,如果他們已經被加載,無論是繼源查詢的.Include(),或由於物業被訪問(如果配置爲延遲加載)。

通常,我可以這樣做:

context.Entry(myEntity).Reference(e => e.MyNavigationProperty).IsLoaded; 

但自然不會有未經跟蹤實體工作,因爲,唉,真是未經跟蹤。我有一種感覺,答案是「不」,但是有沒有一種方法可以確定導航屬性是否已加載到未跟蹤的實體上(而不會訴諸於動態代理上的反射等任何混亂)?

謝謝!

回答

1

下面的解決方案不會使用通過訪問未跟蹤的實體從db加載的實體。儘管隨後對該導航屬性的引用不會創建數據庫命中,但導航屬性不會被實體框架跟蹤。我將以此爲例說明如何不這樣做;)

如何使用本地?因此,讓我們說你有

public class MyEntity 
{ 
    public int MyEntityId { get; set;} 
    public int MyNavigationPropertyID { get; set;} 
    public MNP MyNavigationProperty { get; set; } 
} 

public class MNP 
{ 
    public int MNPID { get; set;} 
} 

你可以這樣做:

目前正在跟蹤和沒有被標記爲刪除
context.MyNavigationProperties.Local.Where(e => e.MNPID == MyNavigationProperty); 

本地實體店。我沒有測試過,但它應該工作。

+0

沒有骰子 - 因爲實體未被跟蹤,它(及其相關實體)不會被緩存在上下文中。 'Local.Count'始終爲0. – 2013-04-24 15:50:57

+0

如果NMP被加載爲已跟蹤,那麼您應該能夠在本地找到它。如果你的所有實體都被加載爲未跟蹤的,那麼我認爲你不能從dbcontext獲取這些信息......因爲它們沒有被跟蹤。讓我們等待Slauma。 – 2013-04-24 16:16:06

+0

是的,從上下文獲取信息看起來不太可能,但信息必須包含在實體本身中(因爲它需要跟蹤該值是否已經被延遲加載等)。我希望在某個地方有一些可能提供這些信息的模糊方法。 :) – 2013-04-24 16:22:42