2010-11-19 62 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