我正在使用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
的行为?
答案 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必须加载集合。