什么是实体框架包括()和何时使用它?



我看了一下EFInclude()方法的定义和示例,但不幸的是,对于我的问题"什么是实体框架包括()以及何时使用它?"没有适当的解释。

下面是一个用法示例。它的一般用途是什么?我为什么/什么时候应该使用它?

using (var context = new MyContext())
{
var list = context.Customers
.Include(c => c.Invoices)    
.ToList();    

foreach (var customer in list)
{
Console.WriteLine("Customer Name: {0}", customer.Name);
foreach (var customerInvoice in customer.Invoices)
{
Console.WriteLine("tInvoice Date: {0}", customerInvoice.Date);
}
}
}

在您的案例中,我假设是"客户";和";Invoices"是两个独立的表

假设你有一个客户:

var customer = context.Customers.FirstOrDefault();

如果您试图找到该客户的发票:

customer.Invoices

会发生什么?这取决于您的ORM配置。有两种模式

延迟加载使用该模式(我认为是默认模式),您将首先调用数据库来检索客户(但只有客户),然后第二次调用数据库来检索该客户的发票。但是,第二次呼叫只会在您试图到达发票时发生。

立即加载如果你不想有多个数据库调用,你想在一个调用中获得所有的数据,你可以禁用延迟加载。但是,如果你以我上面展示的同样方式获得客户,你将无法获得发票(你将获得"null")相反)。"Include"让EF知道你想在一个数据库调用中检索客户和发票:

var customer = context.Customers.Includes(c => c.Invoices).FirstOrDefault();

当您尝试获取该客户的发票时,所有内容都已经在内存中,因此没有额外的数据库调用。

考虑Invoice id为主键和客户。Invoiceid是外键。如果你映射了合适的导航属性

调用Include("Invoices")的最后一条语句可能看起来像这样:

SELECT *从客户加入客户发票。

最新更新