2013-03-02 17 views
0

我需要加載實體的導航屬性。我一直在閱讀great article關於如何使用實體框架(6.0)加載導航屬性的不同方法。首先獲取ObjectContext EF代碼的引用

顯式加載的第二種方式來自ObjectContext,而不是來自EntityCollection或EntityReference的 。如果您依靠實體框架中的 POCO支持,您的導航屬性將不會爲 爲EntityCollections或EntityReferences,因此將不會有 Load方法。相反,您可以使用ObjectContext.LoadProperty 方法。 LoadProperty使用泛型來標識你從 加載的類型,然後使用lambda表達式來指定要加載的導航 屬性。下面是使用LoadProperty檢索 的寵物爲特定人實例的例子:

context.LoadProperty<Family>(familyInstance, f => f.Pets) 

現在我需要知道的唯一的事:

我怎麼到ObjectContext的參考?

DbContext似乎不是從中得出的,也沒有提及它。 LoadProperty<T>不是靜態的,所以我需要一個對象引用。

+0

可能重複http://stackoverflow.com/questions/8059900/convert-dbcontext-to- objectcontext-for-use-with-gridview) – 2013-03-02 12:35:35

+0

喲thx很多。將刪除該問題。對不起,重複。 – bas 2013-03-02 12:40:50

回答

1

我知道有兩種方法可以用DbContext加載相關集合。

其中一個是您詢問的選項,但另一種方式是我已經使用了一段時間,並且不需要對ObjectContext的引用。該方法從DbEntityEntry集合中工作。下面是一個例子:

public void Load<TEntity, TElement>(
     TEntity entity, 
     Expression<Func<TEntity, ICollection<TElement>>> relation) 
    where TEntity : AbstractEntity, new() 
    where TElement : AbstractEntity, new() 
{ 
    var x = _context.Entry(entity); 
    if (!x.State.Is(EntityState.Detached) && !x.State.Is(EntityState.Added)) 
     x.Collection(relation).Load(); 
} 

public void Load<TEntity, TElement>(
     TEntity entity, 
     Expression<Func<TEntity, TElement>> relation) 
    where TEntity : AbstractEntity, new() 
    where TElement : AbstractEntity, new() 
{ 
    var x = _context.Entry(entity); 
    if (!x.State.Is(EntityState.Detached) && !x.State.Is(EntityState.Added)) 
     x.Reference(relation).Load(); 
} 
[轉換的DbContext到ObjectContext的用於與GridView的用途](
+1

嗯,這是一個不錯的選擇。我可以upvote並接受你的問題,問題是你666分!這是一個該死的恥辱不是它;-)。無論如何,你會不會撒你的。 thx的答案:) – bas 2013-03-02 14:13:16

+1

@ BAS是這是一個恥辱,但它不能持續;-) – qujck 2013-03-02 14:34:36