Mig*_*ura 5 entity-framework entity-framework-core
我在Entity Framework Core中有以下内容:
public class Book {
public Int32 Id { get; set; }
public String Title { get; set; }
public virtual Theme Theme { get; set; }
}
public class Theme {
public Int32 Id { get; set; }
public String Name { get; set; }
public Byte[] Illustration { get; set; }
public virtual ICollection<Ebook> Ebooks { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有以下linq查询:
List<BookModel> books = await context.Books.Select(x =>
new BookModel {
Id = x.Id,
Name = x.Name,
Theme = new ThemeModel {
Id = x.Theme.Id,
Name = x.Theme.Name
}
}).ToListAsync();
Run Code Online (Sandbox Code Playgroud)
我不需要包含主题来完成这项工作,例如:
List<BookModel> books = await context.Books.Include(x => x.Theme).Select(x => ...
Run Code Online (Sandbox Code Playgroud)
我什么时候需要在实体框架中使用Include?
UPDATE
我在主题中添加了一个Byte []插图类型的列.在我的预测中,我不包括该列,如果我使用Include,它会加载吗?或者永远不会加载,除非我在投影中有它?
您不需要 Include 因为您在 EF 上下文中工作。当您在正在创建的匿名对象中引用 Theme 时,这不是使用延迟加载,而是告诉 EF 进行连接。
如果您返回书籍列表并且不包含主题,那么当您尝试获取主题时,您会注意到它为空。如果 EF 连接是打开的并且你有延迟加载,它会去数据库并为你抓取它。但是,如果连接没有打开,那么你必须明确地得到它。
另一方面,如果您使用 Include,您将立即获得数据。在幕后,它会对必要的表进行 JOIN 并在那里获取数据。
您可以检查 EF 为您生成的 SQL 查询,这将使您更清楚。您只会看到一个 SQL 查询。
如果您Include是孩子,它将作为原始查询的一部分加载,这使得它更大。
如果您不这样做Include或在查询中以其他方式引用子项,则初始结果集会较小,但稍后引用的每个子项将通过对数据库的新请求进行延迟加载。
如果您在一个请求中循环访问 1000 个用户,然后每个用户请求 10 张照片,那么如果您不这样做,您将发出 1001 个数据库请求Include...
此外,延迟加载要求上下文尚未被释放。例如,当您将实体传递给视图以进行 UI 渲染时,总是会出现令人不快的意外。
更新 尝试一下这个例子,看看它失败:
var book = await context.Books.First();
var theme = book.Theme;
Run Code Online (Sandbox Code Playgroud)
然后试试这个:
var book = await context.Books.Include(b => b.Theme).First();
var theme = book.Theme;
Run Code Online (Sandbox Code Playgroud)
为了从 Microsoft 方面寻找您问题的官方答案,我在 aspnet/Announcements github 存储库中找到了 Diego Vega(实体框架和 .NET 团队的一部分)的这句话:
我们在查看用户 LINQ 查询时看到的一个非常常见的问题是使用 Include() ,因为它是不必要的并且无法兑现。典型的模式通常如下所示:
Run Code Online (Sandbox Code Playgroud)var pids = context.Orders .Include(o => o.Product) .Where(o => o.Product.Name == "Baked Beans") .Select(o =>o.ProductId) .ToList();人们可能会认为这里的 Include 操作是必需的,因为在 Where 和 Select 操作中引用了 Product 导航属性。但是,在 EF Core 中,这两件事是正交的:包括控制在最终结果返回的实体中加载哪些导航属性,我们的 LINQ 转换器可以直接翻译涉及导航属性的表达式。
| 归档时间: |
|
| 查看次数: |
2647 次 |
| 最近记录: |