实体框架 5 仅在特定级别包含

本文关键字:包含 框架 实体 | 更新日期: 2023-09-27 18:31:07

在 POCO 实体上使用 Include 时,无论我在何处设置包含路径,似乎都包含所有单个路径。

例如,假设我有三个表:

USER
-----
Id
Name
AUTHOR
-----
Id
Name
LastEditUserId
BOOK
-----
Id
Name
AuthorId
LastEditUserId

假设我想获得所有Book以及相关的Author及其User s.意思是,我对Book.User不感兴趣。因此,包含的内容将是:

var books = db.Book;
books.Include(b => b.Author.User);

但是返回的对象将同时具有与其相关User相关的Author以及与Book本身相关的User,我没有要求。

有没有办法只包含选定的路径,而不是通常包含整个类(就像它似乎正在做的那样)?

实体框架 5 仅在特定级别包含

比如说,你有一个给定的Book,带有键1。本书与Author = 2有关,Book.UserBook.Author.User是指User = 3。如果随后运行查询...

var book1 = db.Books.Include(b => b.Author.User).Single(b => b.Id == 1);

。EF 将准确加载你请求的内容,即书籍 1、作者 2 和用户 3,并且所有三个实体都将附加到上下文。EF 还将外键从书本直接加载到用户(这是3),因为外键始终加载。当实体加载到上下文时,它将检测到附加了具有键3User实体,并将其自动分配给导航属性Book.User,因为它的外键也是3的。此过程称为关系修复。它对运行的 SQL 查询没有任何开销,实际上仅基于您的显式Include请求。您无法禁用此行为。

如果Book.User引用其他用户而不是Book.Author.User则导航属性Book.User将保持null(除非Book.User引用的实体已通过某些以前的查询或手动附加附加到上下文)。