为什么我需要一个ToList()来避免出现上下文错误? [英] Why do I need a ToList() to avoid disposed context errors?

查看:103
本文介绍了为什么我需要一个ToList()来避免出现上下文错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一些代码来使用EntityFrameWork访问数据库。代码是:

I'm writing some code to access a database using EntityFrameWork. The code is:

public IEnumerable<Rows> GetRows(int id)
{
    using (var context = new ApplicationDbContext())
    {
        var repository = new EntityFrameWorkRepository<int, RowEntity>(context);
        //need a ToList() here to prevent disposed dbcontext errors
        return repository.GetRowsFromDb(id).ToList();
    }
}

GetRowsFromDb()使用LINQ查询数据库和过滤结果使用id。

GetRowsFromDb() uses LINQ to query the database and filter the results using id.

我最初写了上面的方法,没有ToList()调用,但是当我尝试访问返回的IEnumerable中的对象时,我会得到关于已经处理的dbcontext的一个例外。我不明白上述代码如何解决问题,尽管它可以工作。我假设ToList()是深度复制对象,这可能提供了从上下文/数据库所需的分离,但是确定原始对象应该可以使用?

I originally wrote the above method without the ToList() call, but when I tried to access objects in the IEnumerable which was returned, I would get an exception about the dbcontext already being disposed. I don't understand how the above code fixes things, although it does then work. I assume ToList() is deep copying the object and that this perhaps provides the required separation from the context/database, but surely the original object should be usable?

推荐答案

您需要调用 ToList ToArray 或其他枚举方法的原因EF返回的数据是LINQ中的查询执行被延迟:直到你明确看待数据才会被处理。当您的方法返回已经获取查询数据的上下文关闭时(您的使用块快速处理),导致您看到的异常。

The reason you need to call ToList, ToArray, or some other method that enumerates the data returned by EF is that query execution in LINQ is deferred: the data is not processed until you take it explicitly. By the time your method returns the context through which the query data has been obtained is closed (your using block takes care of that happening quickly), causing the exception that you see.

这样做是为了使代码不花时间处理你不需要的数据。例如,您可以编写开始读取客户端数据的代码,并在中间停止。如果查询执行没有推迟,您将花费时间和内存来获取查询的尾才能将其抛弃。延期执行让您处于控制之中:您可以根据您计划对数据做什么来决定要保留的数据,或将整个集合带入内存。

This is done so that the code is not spending time processing the data that you do not need. For example, you could write code that starts reading through the data on the client side, and stops in the middle. If query execution were not deferred, you would have spent time and memory obtaining the "tail" of the query only to throw it away. Deferred execution puts you in control: you decide what data you want to keep as you go, or bring the entire collection to memory based on what you plan to do with the data.

这篇关于为什么我需要一个ToList()来避免出现上下文错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆