实体框架中的一对多错误

时间:2016-07-06 18:49:51

标签: entity-framework

我对Entity Framework很新,并遇到了以下问题:

public class Bank{
      //Showed only problem moments
      public Guid Id {get;set;}
      public List<Branch> Branches { get; set; }
      public Bank(){
            Branches = new List<Branch>();  
      }      
}

public class Branch{
     public Guid Id {get;set;}
     public string Address {get;set;}
}

我尝试从代码中手动添加新的Bank和Branch,但它确实有效。它还在MSSQL中创建了具有所有PK和FK的表。 但是,当我尝试做以下事情时:

var bankData = new ApplicationContext().Banks;
return Json(bankData, JsonRequestBehavior.AllowGet)

我只获得了我的银行数据,而且分支机构为空。

我是否错误地在CodeFirst中创建关系?

2 个答案:

答案 0 :(得分:4)

从EF 4.1及更高版本开始,有一个strongly typed .Include,它允许通过将Select表达式提供到适当的深度来指定所需的预先加载加载深度。

using System.Data.Entity; // NB!

var bankData = new ApplicationContext().Banks
                     .Include(b=> b.Branch)

或者如果您不想使用System.Data.Entity,请使用

new ApplicationContext().Banks.Include("Branches");

然后使用相同的代码

返回JSON
return Json(bankData, JsonRequestBehavior.AllowGet)

渴望加载:

预先加载是一种过程,即对一种类型的实体的查询也会将相关实体作为查询的一部分加载。使用Include()方法实现了预先加载。

在以下示例中,它使用Include()方法从数据库中获取所有学生及其标准。

延迟加载:

实体框架的一个重要功能是延迟加载。延迟加载意味着延迟加载相关数据,直到您特别请求它为止。

答案 1 :(得分:0)

实体框架默认情况下不会填充实体上的子对象。但是,有这样做的机制。一种是使用延迟加载(我不喜欢它,因为它使用多个数据库调用,如果开发人员不知道发生了什么,可能会导致性能问题),并使用includes(在单个中获取所有数据)呼叫)。

要使用包含,您可以:

new ApplicationContext().Banks.Include("Branches");