实体框架 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
,我没有要求。
有没有办法只包含选定的路径,而不是通常包含整个类(就像它似乎正在做的那样)?
比如说,你有一个给定的Book
,带有键1
。本书与Author
= 2
有关,Book.User
和Book.Author.User
都是指User
= 3
。如果随后运行查询...
var book1 = db.Books.Include(b => b.Author.User).Single(b => b.Id == 1);
。EF 将准确加载你请求的内容,即书籍 1、作者 2 和用户 3,并且所有三个实体都将附加到上下文。EF 还将外键从书本直接加载到用户(这是3
),因为外键始终加载。当实体加载到上下文时,它将检测到附加了具有键3
的User
实体,并将其自动分配给导航属性Book.User
,因为它的外键也是3
的。此过程称为关系修复。它对运行的 SQL 查询没有任何开销,实际上仅基于您的显式Include
请求。您无法禁用此行为。
如果Book.User
引用其他用户而不是Book.Author.User
则导航属性Book.User
将保持null
(除非Book.User
引用的实体已通过某些以前的查询或手动附加附加到上下文)。