Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF代码首先不返回相关对象_Entity Framework_Ef Code First - Fatal编程技术网

Entity framework EF代码首先不返回相关对象

Entity framework EF代码首先不返回相关对象,entity-framework,ef-code-first,Entity Framework,Ef Code First,我首先使用EF代码和一个预先存在的数据库 两个目标: public Foo { public int FooId {get;set;} } public Bar { public int BarId {get;set;} public virtual Foo Foo {get;set;} } FooId和BarId都是数据库中的主键,Bar表有一列FooId,该列是指向Foo表的外键 当我选择一个条,Foo是一个空引用。我本以为EF会自动将他们两人拉到一起,但也许我遗

我首先使用EF代码和一个预先存在的数据库

两个目标:

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

public Bar
{
    public int BarId {get;set;}
    public virtual Foo Foo {get;set;}
}
FooId
BarId
都是数据库中的主键,
Bar
表有一列
FooId
,该列是指向
Foo
表的外键

当我选择一个
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");
    }
}
公共类EFCodeFirst:DbContext
{
公共EFCodeFirst()
{
this.Database.Connection.ConnectionString=ConfigurationManager.ConnectionString[“AlternateString”].ConnectionString;
}
公共DBSet Foos{get;set;}
公共DBSet条{get;set;}
模型创建时受保护的覆盖无效(System.Data.Entity.ModelConfiguration.ModelBuilder ModelBuilder)
{
modelBuilder.IncludeMetadataInDatabase=false;
modelBuilder.Entity().MapSingleType().ToTable(“Foo”);
modelBuilder.Entity().MapSingleType().ToTable(“Bar”);
}
}

如果您对Foo的期望不应为null是因为您将它设置为虚拟的Bar对象,那么情况并非如此。通过使它们成为虚拟的,您只需选择EF延迟加载,它将为null,直到您通过在Bar对象上访问它来显式请求它为止。除此之外,如果您希望预先填充它,则必须使用Include方法加载它

要显式禁用延迟加载,您可以使用以下代码,即使您不需要它,因为您只需从导航属性中删除virtual关键字,延迟加载就会消失

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

在内部,DbContext使用一个受保护的ObjectContext,您也可以在继承的DbContext类(例如EFCodeFirst)中使用该ObjectContext。

您在Foo类中缺少一行,该Foo包含一个Bar集合。

但无论哪种方式,它都应该解析,对吗?我也不知道什么时候禁用延迟加载。没有一个对象引用了
ContextOptions.LazyLoadingEnabled
。是的,这是正确的,它确实有效。您需要向我们显示不起作用的代码。我还编辑了我的答案,以显示如何更改
ContextOptions的值。LazyLoadingEnabled
您也可以先发布代码映射吗?如果使用Include(“Foo”)调用查询会发生什么情况?如果I
Include(“Foo”)
它可以工作。当前不需要从父Foo访问Bar对象。是的,但这就是告诉EF建立关系的原因,没有它会给您空引用异常