Ленивая загрузка с коннектором MySQL - PullRequest
5 голосов
/ 01 ноября 2011

У меня есть проект Visual Studio 2008 C # .NET 3.5, использующий MySql 5.1.53 и MySql Connector / Net 6.4.4 в Windows 7 x64. В моем приложении я запрашиваю свою базу данных как:

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

Исключение, которое я получаю:

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.

Я действительно предпочел бы иметь возможность лениво загружать остальную часть моего объекта, поскольку его элементы необходимы. Есть ли способ сделать это, или мне нужно .Include () весь мой объект в исходном запросе?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

К сожалению, MySQL не поддерживает несколько активных наборов результатов (MARS), таких как SQL Server. Я не думаю, что реализация вашего запроса в EF позволит это.

Тем не менее, вы можете создать универсальный тип Lazy Task, который имеет фабричное действие, которое выполняет запрос LINQ для EF.

1 голос
/ 01 ноября 2011

Судя по полученной ошибке, у вас все еще открыто соединение, которое используется для загрузки данных из исходного запроса, поэтому вы не можете открыть другое соединение в том же контексте.

Сначала попробуйте материализовать свой запрос, чтобы не пытаться выполнить отложенную загрузку, пока вы все еще загружаете исходный пакет данных в:

var list = my_query.ToList();
foreach (Zoo z in list)
...
...