Странное поведение EF при передаче DbSet методу с типом параметра IEnumerable <> - PullRequest
1 голос
/ 17 декабря 2011

У меня есть класс репозитория, который запрашивает EF DbContext следующим образом:

public IEnumerable<ProductFilterData> GetAllProducts()
{
   return this.DataContext.Products.Select(x => new ProductFilterData { Id = x.Id, Name = x.Name, ProductDetailLevelCode = x.ProductDetailLevel.Code, Description = x.Description, ParentProductIds = x.ParentProducts.Select(p => p.Id) });
}

Который работает нормально. Тем не менее, когда я рефакторинг этот код для этого:

public IEnumerable<ProductFilterData> GetAllProducts()
{
    return this.MapToProductFilterData(this.DataContext.Products);
}

private IEnumerable<ProductFilterData> MapToProductFilterData(IEnumerable<Product> products)
{
    return products.Select(x => new ProductFilterData { Id = x.Id, Name = x.Name, ProductDetailLevelCode = x.ProductDetailLevel.Code, Description = x.Description, ParentProductIds = x.ParentProducts.Select(p => p.Id) });
}

Я получаю исключение:

Уже есть открытый DataReader, связанный с этой командой, который должен быть закрыт первым.

Почему передача ссылки на DbSet методу вызывает изменение в поведении EF? Между прочим, если я изменяю тип параметра MapToProductFilterData на IQueryable, тогда он работает. Кроме того, если я удаляю сопоставления отношений, это также работает.

1 Ответ

4 голосов
/ 17 декабря 2011

Вы должны изменить его на IQueryable, потому что если вы передадите его как IEnumerable, вы фактически выполните запрос SELECT * FROM Product.Ваш метод начинает повторять набор результатов, но ваша проекция вызывает x.ParentProducts.Select(p => p.Id), что приводит к отложенной загрузке ParentProducts свойства навигации.Ленивая загрузка открывает второе активное средство чтения данных, что возможно, только если у вас включен в строке подключения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...