我对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中创建关系?
答案 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");