Откройте DataReader при отображении из кода EF 4.1 и ValueInjecter - PullRequest
1 голос
/ 11 ноября 2011

Я использую Entity Framework 4.1 code first с ASP.NET MVC 3 и Razor view и ValueInjecter.

На мой взгляд модель:

public class ProductViewModel
{
     public int Id { get; set; }
     public string SKU { get; set; }
     public string Name { get; set; }
     public ICollection<Specification> Specifications { get; set; }
}

Класс модели:

public class Product : IEntity
{
     public int Id { get; set; }
     public string SKU { get; set; }
     public string Name { get; set; }
     public virtual ICollection<Specification> Specifications { get; set; }
}

Мой метод действия, при котором я возвращаю список продуктов, а затем мне нужно сопоставить каждый продукт с моделью представления.

public ActionResult JsonGetProductList()
{
     IEnumerable<Product> productList = productService.GetAll();

     // Mapping
     IList<ProductViewModel> viewModelList = productList.Select(c => new ProductViewModel().InjectFrom(c)).Cast<ProductViewModel>().ToList();
}

Выдает ошибки в части отображения со следующей ошибкой:

There is already an open DataReader associated with this Command which must be closed first.

Как бы это исправить?

1 Ответ

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

Эта ошибка появляется при отложенной загрузке свойства результатов до закрытия DataReader исходного запроса. Вы можете вызвать метод ToList после GetAll, чтобы принудительно завершить выполнение запроса, или вы можете добавить конфигурацию MultipleActiveResultSets в строку подключения, чтобы разрешить несколько DataReaders, например:

ConnectionString = "источник данных = ваш_сервер; Integrated Security = SSPI; Initial Catalog = YourDB; MultipleActiveResultSets = истина "

...