Entity Framework: Бұл Пәрменмен байланыстырылған ашық DataReader бар, ол алдымен жабылуы керек

Бұл сұрақ Бұл байланысты :

Менің репозиториям әдісім осы кодты қамтиды:

 public IEnumerable GetApplicationPositionHistories(int applicantId, int positionId)
        {
            return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o => o.applicantPosition) ;
        }

Менің Html-тегі мына код бар:

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.applicantPosition.Position.name)
        </td>

The full exception is:

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

It was throw in the first line of the HTML @Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)

7

5 жауаптар

Жылдам шешім:

public IEnumerable GetApplicationPositionHistories(int applicantId, int positionId)
    {
        return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o => o.applicantPosition).ToList() ;
    }

Егер сіз білесіз бе, бұл мәселені шешудің себебі LINQ және дефференциалды орындау қалай жұмыс істейтіндігі туралы оқыңыз. Бірнеше сөзбен айтқанда - егер сіз «мәжбүрлеп» орындауды орындауды «тізімдеу» жолымен «ToList» арқылы жасамасаңыз, ол іс жүзінде тым кеш орындалады. Және бұл бірдей қосылымды пайдаланғысы келетін басқа сұраулармен қиындық туғызады.

21
қосылды
Мен сол сияқты қате туындаған сыныптардың бірінде бір-нөлдік немесе бір қарым-қатынас болатын TPH мұра құрылымын пайдаланып модельдік базалық сыныптан мұраға алу үшін екі ұқсас модель сыныптарын қайта жасаған кезде пайда болды. осы модель үшін контроллерге қызықты жүктеуді қолданыңыз. Менің түсінуімше, бұл жағдайда жүктемені жүктеуге қолдау жоқ, сондықтан контроллердегі осы сипат үшін .clude (...) сөзін тастап, қосыңыз .ToList() менің қалған соңына дейін. Инклюзивті (...) сөздері мәселені шешіп қойды - рахмет.
қосылды автор Aaron Newton, көзі

Қосылым жолына MultipleActiveResultSets = true қосуды байқап көрдіңіз бе?

12
қосылды
Мен контекстімді қолдандым. . Опта келтірген қатені қандай да бір себеппен келтіретін (id). Бұл параметрді қосылым жолына қосу мәселені шешеді.
қосылды автор CodeMonkey, көзі

Бұл сұрау басқа сұрау ішінде болғанда жаңа сұрау орындалатын болады. Сіздің көзқарасыңызда мұндай нәрсе бар екенін қарастырыңыз

@Html.DisplayFor(modelItem => item.Device.Name)

және сізде Құрылғы моделінде бар

    public string Name
    {
        get
        {
            return String.Format("{0} {1}", Brand.BrandName, Model.ModelName);
        }
    }

Содан бері Device.Name-ді бағалау үшін оның Бренд және Моделін сұрау талап етіледі, сонда ол сұрау ішіндегі сұрау болады және осылайша шешім MutlipleActiveResultSets :

    
6
қосылды

Әдетте EF нысанын көрінбейді, бірақ көрініс үлгісі үшін POCO нысаны жасаңыз және сұрау үлгісіне көрініс үлгісіне салыстыру. EF сұрауды репозитория әдісінде орындамайды, себебі сұрау анықтама уақытында орындалмайды, бірақ деректерге кірген кезде ғана. Сіздің ойыңызша, сіз бірдей сұрауды бірнеше рет пайдаланасыз және бұл дұрыс емес.

If you want to access the list of object returned by your repository method, use toList

1
қосылды

Сұрауыңыздың орындалуын аяқтағанға дейін ApplicantPosition мекемесінен Позиция туралы сілтеме жүктеуді қажет ететін болсаңыз, нақты мәселе. Егер сіз осы сценарийге кейінге қалдырылған орындауды сақтағыңыз келсе, Сіздің сұрауыңыздағы Орналасу туралы анықтаманы осылай жүктей аласыз:

Include(o => o.applicantPosition.Select(a => a.Position));

және сіздің GetApplicationPositionHistories-та IEnumerable қайтарады.

Екінші шешім сұрауда ToList() немесе ToArrray() әдістерін шақыратын GetApplicationPositionHistories әдісінде сұрауды іске қосу болып табылады.

0
қосылды