在POCO实体上使用Include
时,无论我在何处设置包含路径,看起来都包含所有单个路径。
例如,假设我有三个表:
USER
-----
Id
Name
AUTHOR
-----
Id
Name
LastEditUserId
BOOK
-----
Id
Name
AuthorId
LastEditUserId
假设我希望获得所有Book
s与相关的Author
及其User
s。意思是,我对Book.User
不感兴趣。
所以包含的内容是:
var books = db.Book;
books.Include(b => b.Author.User);
但是返回的对象将包含Author
及其相关User
和User
与Book
本身相关的内容,我没有要求。< / p>
有没有办法只包含选定的路径而不是一般的整个类(就像它似乎在做的那样)?
答案 0 :(得分:1)
说,您有一个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
),因为外键总是被加载。当实体加载到上下文时,它将检测到附加了键User
的{{1}}实体并将其自动分配给导航属性3
,因为其外键为{{1}也是。此过程称为 relationship fixup 。它没有任何关于运行的SQL查询的开销,实际上只基于您的显式Book.User
请求。您无法禁用此行为。
如果3
引用除Include
以外的其他用户,则导航属性Book.User
将保留Book.Author.User
(除非Book.User
所引用的实体已附加一些以前的查询或手动附加的上下文。