0

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

例如,假设我有三个表:

USER
-----
Id
Name

AUTHOR
-----
Id
Name
LastEditUserId

BOOK
-----
Id
Name
AuthorId
LastEditUserId

假设我想获取所有Book带有相关Authors 及其s 的Users。意思是,我不感兴趣Book.User。所以包含将是:

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

但是返回的对象将同时具有Author与它相关User的和UserBook自身相关的,这是我没有要求的。

有没有办法只包括选定的路径,而不是一般来说,包括整个班级(正如它似乎正在做的那样)?

4

1 回答 1

1

说,你有一个给定Book的 key 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 还将外键从 book 直接加载到用户(即3),因为总是加载外键。当实体加载到上下文中时,它将检测到User带有键的实体3已附加并自动将其分配给导航属性Book.User,因为它的外键也是3如此。此过程称为关系修复Include对于实际上仅基于您的显式请求而运行的 SQL 查询,它没有任何开销。您不能禁用此行为。

如果Book.User引用另一个用户,Book.Author.User则导航属性Book.User将保留null(除非引用的实体Book.User已通过某些以前的查询或手动附加附加到上下文)。

于 2013-09-12T16:04:15.053 回答