延迟加载MySQL连接器

Pau*_*ulH 5 c# mysql lazy-loading

我在Windows 7 x64上使用MySql 5.1.53和MySql Connector/Net 6.4.4进行Visual Studio 2008 C#.NET 3.5项目.在我的应用程序中,我查询我的数据库:

IQueryable<Zoo> my_query = from d in my_context_.MySet
                                  .Include("Foo")
                                  .Include("Bar")
                                  where d.Fuzz.Status == (int)Status.Pending
                                  orderby d.Order
                                  select d;

foreach (Zoo z in my_query)
{
    if (some_expression)
    {
        // Lazy load some more data from the query. This throws a 
        // MySqlException
        z.Something.Load();
    }
    else
    {
        // Lazy load some other data from the query. This also throws a 
        // MySqlException
        z.SomethingElse.Load();
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的例外是:

System.Data.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> MySql.Data.MySqlClient.MySqlException: There is already an open DataReader associated with this Connection which must be closed first.
Run Code Online (Sandbox Code Playgroud)

我真的更喜欢能够懒惰加载我的对象的其余部分,因为它需要它的元素.有没有办法做到这一点,或者我需要.Include()我的整个对象在原始查询中?

Str*_*ior 1

根据您收到的错误,您似乎仍然打开了用于从初始查询加载数据的连接,因此您无法在同一上下文中打开另一个连接。

首先尝试具体化您的查询,这样您在仍在加载初始批次数据时就不会尝试延迟加载:

var list = my_query.ToList();
foreach (Zoo z in list)
...
Run Code Online (Sandbox Code Playgroud)

  • @manu08:我完全理解你对这个框架的失望。如果您找到针对给定问题的更好解决方案,那就太棒了:请分享。无论如何,我鼓励您遵循 http://stackoverflow.com/privileges/vote-down 上的指南。即:“每当你遇到一个极其草率、不费力的帖子,或者一个答案显然是错误的,甚至可能是危险的错误时,请使用你的反对票。” (2认同)