gpt4 book ai didi

c# - Entity Framework 代码优先查找与 SingleOrDefault(预加载)

转载 作者:可可西里 更新时间:2023-11-01 07:57:14 24 4
gpt4 key购买 nike

我正在使用 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);

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

最佳答案

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

关于c# - Entity Framework 代码优先查找与 SingleOrDefault(预加载),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10110682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com