【问题标题】:Entity Framework Code First Find vs SingleOrDefault (Eager Loading)Entity Framework Code First Find vs SingleOrDefault (Eager Loading)
【发布时间】:2012-04-11 17:09:27
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 不知道这个本地属性存在。谢谢!
    • 您好,关于操作速度,Find vs SingleOrDefault 获取Entity信息?
    【解决方案2】:

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

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

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

    【讨论】:

    • 他的意思是他不想使用延迟加载,而是希望它们急切加载。
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多