2010-11-19 63 views
2

我使用EF代碼優先與預先存在的數據庫。EF代碼首先不返回相關對象

兩個對象:

public Foo 
{ 
    public int FooId {get;set;} 
} 

public Bar 
{ 
    public int BarId {get;set;} 
    public virtual Foo Foo {get;set;} 
} 

兩個FooIdBarId是在數據庫中的主鍵,並將Bar表具有列FooId其是在Foo表的外鍵指向。

當我選擇Bar時,Foo是空引用。我原以爲EF會自動將他們兩個拉到一起,但也許我錯過了什麼?

數據庫映射:

public class EFCodeFirst : DbContext 
{ 
    public EFCodeFirst() 
    { 
     this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["AlternateString"].ConnectionString; 
    } 

    public DBSet<Foo> Foos {get;set;} 
    public DBSet<Bar> Bars {get;set;} 

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
    { 
     modelBuilder.IncludeMetadataInDatabase = false; 
     modelBuilder.Entity<Foo>().MapSingleType().ToTable("Foo"); 
     modelBuilder.Entity<Bar>().MapSingleType().ToTable("Bar"); 
    } 
} 
+0

你還可以發佈你的代碼第一次映射嗎?如果您使用Include(「Foo」)調用查詢,會發生什麼情況? – 2010-11-19 10:46:00

+0

如果我包括(「Foo」)'它的工作。 – mattdwen 2010-11-20 02:08:55

回答

2

如果富的期望不能爲空,是因爲我們來是你讓虛擬酒吧對象上,那麼這是不是這樣的。通過使它們變爲虛擬,您只需選擇EF延遲加載,直到您通過在Bar對象上訪問它明確要求它爲止。除此之外,如果你想要它被預先填充,你將不得不加載它與包括方法。

要明確禁用延遲加載,即使您不需要它,也可以使用以下代碼,因爲您可以從導航屬性中刪除虛擬關鍵字,並且延遲加載將消失。

public EFCodeFirst() 
{   
    this.ObjectContext.ContextOptions.LazyLoadingEnabled = false; 
} 

內部,的DbContext使用保護 ObjectContext的,你還可以將繼承的DbContext類(例如EFCodeFirst)內使用。

+0

但無論如何它仍應該解決,正確?無論是早期還是晚些時候撥打數據庫。 – mattdwen 2010-11-19 06:04:51

+0

我也無法確定何時禁用延遲加載。沒有任何對象具有對「ContextOptions.LazyLoadingEnabled」的引用。 – mattdwen 2010-11-20 02:10:03

+0

是的,這是正確的,它確實有效。您需要向我們展示不起作用的代碼。 – 2010-11-20 03:57:59

0

您在Foo類中缺少一行,Foo包含Bar的集合。

+0

目前沒有必要從父Foo訪問Bar對象。 – mattdwen 2010-11-20 02:04:10

+0

是的,但這是告訴EF建立關係,而不是讓它給你空引用異常 – 2010-11-20 07:06:20