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

时间:2013-09-12 11:07:32

标签: c# .net entity-framework entity-framework-5 .net-4.5

在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及其相关UserUserBook本身相关的内容,我没有要求。< / p>

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

1 个答案:

答案 0 :(得分:1)

说,您有一个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),因为外键总是被加载。当实体加载到上下文时,它将检测到附加了键User的{​​{1}}实体并将其自动分配给导航属性3,因为其外键为{{1}也是。此过程称为 relationship fixup 。它没有任何关于运行的SQL查询的开销,实际上只基于您的显式Book.User请求。您无法禁用此行为。

如果3引用除Include以外的其他用户,则导航属性Book.User将保留Book.Author.User(除非Book.User所引用的实体已附加一些以前的查询或手动附加的上下文。