首页 文章

视图中的Foreach循环:ObjectContext实例已被释放,不能再用于需要连接的操作

提问于
浏览
1

我正在用实体框架 Build 一个mvc web应用程序 .

错误:

EntityFramework.dll中出现“System.ObjectDisposedException”类型的异常但未在用户代码中处理附加信息:ObjectContext实例已被释放,不能再用于需要连接的操作 .

这是实体框架部分:

就像你看到我已经包含“Alineas”并做.ToList()

public IList<Kop> Handle(RetrieveKoppenForDocumentQuery query)
        {
            using (var db = new BmDataContext())
            {
                var koppen = db.Kop.Where(s => s.Document.Id == query.Id)
                    .Include(s => s.TegelAfbeelding)
                    .Include(s => s.CollageAfbeeldingen)
                    .Include(s => s.FinancieleAfbeeldingen)
                    .Include(s => s.Alineas)
                    .ToList();
                return _orderKoppenByIndex(koppen);
            }
        }

这是KopListItems.cshtml的视图:

@using PGE.Bestuursmonitor.Contracts.DataTypes
@model IList<Kop>

@* Helper for recursively rendering koppen*@
@helper SortableItem(Kop kop)
{
    <div class="sortable-item" data-kopid="@kop.Id">
        <div class="row">
            <div class="col-md-7 title-column">
                <i class="fa fa-arrows"></i> @kop.Titel
            </div>
            <div class="col-md-5">
                <div class="col-md-3">
                    <span>
                        @kop.KopType
                    </span>
                </div>
                <div class="col-md-3">
                    <span>
                        @kop.Status
                    </span>
                </div>
                <div class="col-md-6">
                    <span class="pull-right">
                        @if (@kop.Alineas != null) // on this line I receive the exception
                        {
                            // here I would like to do some logic
                        }
                    </span>
                </div>
            </div>
        </div>
        <div class="sortable-container">
            @foreach (var subKop in kop.Koppen)
            {
                @SortableItem(subKop);
            }
        </div>
    </div>
}


@* Recursively render all kop items *@
<div id="koppen_sortable" class="sortable-container">
    @foreach (Kop kop in Model)
    {
        @SortableItem(kop);
    }
</div>

这是KoppenList.cshtml的视图:

@model PGE.Bestuursmonitor.ViewModels.Koppen.IKoppenListViewModel

<h1>@Model.DocumentTitel</h1>

@* Render kop list header *@
<div id="koppen_sortable_header">
    <div class="row">
        <div class="col-md-7"><strong>Titel</strong></div>
        <div class="col-md-5">
            <div class="col-md-3">
                <strong>Type</strong>
            </div>
            <div class="col-md-3">
                <strong>Status</strong>
            </div>
            <div class="col-md-6">
                <span class="pull-right">
                    <button type="button" id="btn_add_sub" class="btn btn-success" title="Kop aanmaken" role="button" onclick="BM.Koppen.LoadAddKopView(null);">
                        <i class="fa fa-plus fa-lg"></i> Kop aanmaken
                    </button>
                </span>
            </div>
        </div>
    </div>
</div>
<div id="koppen_sortable_body">
    @{ Html.RenderPartial("~/Views/Koppen/KopListItems.cshtml", @Model.Koppen); }
</div>

@* Store document id in html DOM, so javascript can reach it from multiple places *@
<input type="hidden" id="document_id" value="@Model.DocumentId" />

控制器中的动作:

[HttpGet]
        public ActionResult KoppenList(string id)
        {
            ViewBag.PageId = id;

            Document document = _retrieveStartPcDocumentQueryHandler.Handle(new RetrieveStartPcDocumentQuery());

            RetrieveKoppenForDocumentQuery query = new RetrieveKoppenForDocumentQuery
            {
                Id = document.Id
            };

            IList<Kop> koppen = _retrieveKoppenForDocumentQueryHandler.Handle(query);

            _koppenListViewModel.Koppen = koppen;
            _koppenListViewModel.DocumentTitel = document.Titel;
            _koppenListViewModel.DocumentId = document.Id;

            return View("~/Views/Koppen/KoppenList.cshtml", _koppenListViewModel);
        }

就像你在KopListItems.cshtml中看到的那样,有2个foreach循环 . 外部的foreach循环工作正常,可以读作“Alineas” . 显示子项的内部foreach给出了这个奇怪的错误 . 出了什么问题?我卡住了 .

1 回答

  • 0

    这是解决方案 . 您还需要在子级别上获取alineas和内容:

    public IList<Kop> Handle(RetrieveKoppenForDocumentQuery query)
            {
                using (var db = new BmDataContext())
                {
                    var koppen = db.Kop.Where(s => s.Document.Id == query.Id)
                        .Include(s => s.TegelAfbeelding)
                        .Include(s => s.CollageAfbeeldingen)
                        .Include(s => s.FinancieleAfbeeldingen)
                        .Include(s => s.Alineas.Select(a => a.Content))
                        .Include(s => s.Koppen.Select(k => k.Alineas.Select(a => a.Content)))
                        .Include(s => s.Koppen.Select(k => k.Koppen.Select(x => x.Alineas.Select(a => a.Content))))
                        .ToList();
                    return _orderKoppenByIndex(koppen);
                }
            }
    

相关问题