18

我正在使用 Entity Framework 4.2(代码优先)来访问我的数据库。我假设如果我使用SingleOrDefault它查询一个实体,如果该实体尚未被跟踪,则只会查询数据库,但情况似乎并非如此。Find另一方面,该方法似乎确实这样做了。问题Find在于它似乎不允许我加载相关数据。

有没有办法使用该Find方法但也急切地加载数据?例如,我想加载一本书及其所有评论:

// Load book from the database
Book book = context.Books.Find(1); 
context.Entry<Book>(book).Collection<Review>.Load(); // Book.Reviews is now populated

// Load book from the change tracker
// This will include all Reviews as well
Book book2 = context.Books.Find(1);

SingleOrDefault我使用 Include 获得图书时,我可以加载评论:

// Load book + reviews from the database
Book book = Book.Include("Reviews").SingleOrDefault(b => b.Id == 1);

// Doing the same thing again requeries the database
Book book2 = Book.Include("Reviews").SingleOrDefault(b => b.Id == 1);

Find有没有办法通过急切的加载来获得 的行为SingleOrDefault

4

2 回答 2

15

Find方法用于按键搜索单个实体。该SingleOrDefault方法用于执行查询。急切加载只能是在数据库上真正执行的查询的一部分,因此不能与Find.

作为一种解决方法,您可以这样重写它:

// This will check only on in-memory collection of loaded entities
Book book = context.Books.Local.SingleOrDefault(b => b.Id == 1);
if (book == null)
{
    book = context.Books.Include(b => b.Review).SingleOrDefault(b => b.Id == 1);
}
于 2012-04-11T19:44:27.513 回答
0

如果启用延迟加载,查找将为您工作。试试这个:

Book book = context.Books.Find(1);
int n = book.Reviews.Count;

检查“n”变量的值。EF 必须在您第一次访问该集合时加载它。

于 2012-04-11T19:15:46.303 回答