实体框架代码首先查找vs SingleOrDefault(Eager Loading)

时间:2012-04-11 17:09:27

标签: c# entity-framework ef-code-first

我正在使用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的行为?

2 个答案:

答案 0 :(得分:12)

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);
}

答案 1 :(得分:0)

如果启用延迟加载查找将适合您。试试这个:

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

检查“n”变量的值。首次访问时,EF必须加载集合。