2011-05-17 63 views
4

假設我有一個實體Foo。EF代碼首先附加並創建代理

public class Foo 
{ 
    public int Id {get;set;} 
    public virtual ICollection<Bar> Bars {get;set;} 
} 

當我從數據庫中得到這個實體時,我實際上得到了一個代理服務器,並且所有的東西都能正常工作。

但是,我可以將Foo附加到DbContext並手動創建代理,因此在附加它後Bars不會返回null,而是一個實際的酒吧集合?

含義

var foo = new Foo { Id = 1 }; 
Context.Set<Foo>().Attach(foo); 
foo = CreateProxyOf(foo); 
var countOfBars = foo.Bars.Count(); 

有什麼樣CreateProxyOf?

回答

6

是有一種方法,但不是Foo的構造函數,你必須使用:

var set = Context.Set<Foo>(); 
var foo = set.Create(); 
foo.Id = 1; 
set.Attach(foo); 
var countOfBars = foo.Bars.Count(); 
+0

是的!那是我正在尋找的 – maxlego 2011-05-17 12:17:02

0

當您獲得所有Foos或單個Foo時,您可以告知EF在同一時間獲得酒吧。例如:在MSDN上

var foos = db.Foos.Include("Bars"); 

var foo = db.Foos.Include("Bars").Single(f => f.Id == 1); 

更多細節在這裏

http://msdn.microsoft.com/en-us/library/bb896272.aspx

+0

我其實換貨是,如果我創建var foo = new Foo {Id = 1}。然後是否可以將它附加到DbContext,以便Bars不會爲空,而是實際的結果集。 – maxlego 2011-05-17 11:33:50

+0

包含返回一個DbQuery <>對象,它似乎沒有Find方法。它是具有Find的DbSet <>類。我錯過了什麼。是否也在DbQuery上查找擴展方法? – 2011-07-15 05:28:03

+0

你是對的 - DbQuery上沒有Find()方法 - 只是更新了代碼來反映這一點。 – 2011-07-15 07:17:59