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 і <моцны> deffered выкананне працуе. У некалькіх словах - калі вы не «сілы» выкананне абраных па «пералічваючы» запыт па ToList, ён на самай справе выконваецца занадта позна - у поле зроку. І гэта выклікае праблемы з іншымі запытамі, якія хочуць выкарыстоўваць злучэнне.

21
дададзена
Адбылася Гэтую ж памылка для мяне, калі я перавызначаны дзве падобных класаў мадэлі успадкаваць ад мадэлі базавага класа, выкарыстоўваючы структуру ў спадчыну Тфа, дзе было адзін да нуля ці адзін адносінамі на адным з вытворных класаў, і я выкарыстоўваючы прагную загрузку ў кантролеры для гэтай мадэлі. З таго, што я разумею, прагная загрузка не падтрымліваецца ў гэтым выпадку, так скінуўшы .INCLUDE (...) для гэтага ўласцівасці ў кантролеры, і даданне .ToList() да канца майго які застаецца .INCLUDE (...) заяву, як уяўляецца, праблема вырашана, - дзякуй.
дададзена аўтар Aaron Newton, крыніца

Вы спрабавалі дадаць MultipleActiveResultSets = TRUE; ў радку падключэння?

12
дададзена
Я выкарыстаў кантэкст. .find (ідэнтыфікатар), які па нейкай прычыне выклікае памылку згадваны ОП. Даданне гэтага параметру да злучальнай-ніткі вырашыць гэтую праблему.
дададзена аўтар 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.

Іншае рашэнне, каб фактычна выканаць запыт аб метадзе GetApplicationPositionHistories выкліку метадаў ToList() або ToArrray() на запыце.

0
дададзена