我使用EF Code First和预先存在的数据库。
两个对象:
public Foo
{
public int FooId {get;set;}
}
public Bar
{
public int BarId {get;set;}
public virtual Foo Foo {get;set;}
}
FooId
和BarId
都是数据库中的主键,Bar
表的列FooId
是指向{{1}的外键} table。
当我选择Foo
时,Bar
是空引用。我原以为EF会自动把它们中的两个拉到一起,但也许我错过了什么?
数据库映射:
Foo
答案 0 :(得分:2)
如果你对Foo的期望不应该为null,那就是你在Bar对象上做了虚拟的事实,那就不是这样了。通过使它们成为虚拟,您只需选择加入EF延迟加载,它将为null,直到您通过在Bar对象上访问它来明确要求它为止。除此之外,如果您希望预先填充它,则必须使用 Include 方法急切加载它。
要显式禁用延迟加载,您可以使用以下代码,即使您不需要它,因为您只需从导航属性中删除虚拟关键字,延迟加载就会消失。 / p>
public EFCodeFirst()
{
this.ObjectContext.ContextOptions.LazyLoadingEnabled = false;
}
在内部,DbContext使用 protected ObjectContext,您也可以在继承的DbContext类中使用它(例如EFCodeFirst)。
答案 1 :(得分:0)
你在Foo类中缺少一行,Foo包含一个Bar的集合。