我不能将ADO.NET实体模型实例包装在这里的using语句中?

时间:2013-08-08 20:20:19

标签: c# .net asp.net-mvc asp.net-web-api ado.net-entity-data-model

我有一个ASP.NET MVC WebAPI项目,我有一个入口点可以通过ID进行一次调查。

public IEnumerable<Models.SurveyQuestionViewModel> GetSurveyById(int id)
{
    using (ITSurveyEntities model = new ITSurveyEntities())
    {
        var questions = model.SurveyQuestions.Where(s => s.SurveyId == id).AsEnumerable();
        if (!questions.Any())
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }

        return (from q in questions
                select new Models.SurveyQuestionViewModel
                {
                    Id = q.Id,
                    Question = q.Question,
                    LongDescription = q.LongDescription,
                });
    }
}

但是,当我向它提出请求时:

$.getJSON(apiUrl + '/' + id)
    .done(function (item) {
        surveyBusy.hide();
        var o = $('#survey-content');
    })
    .fail(function (jqXHR, textStatus, err) {
        var o = $('.error-bar');

        if (err === 'Not Found') {
            o.text('The survey you requested doesn\'t yet have any questions configured.');
        }
        else {
            o.text('An error occurred: ' + err);
        }

        o.fadeIn();
    });

我属于:fail处理程序。在通过开发人员工具检查实际响应后,我发现根本原因如下:

  

由于已经处理了DbContext,因此无法完成操作。

我是否以错误的方式使用此对象?我认为一切都还可以,因为我正在调用AsEnumerable()进行初始查询,从而使数据库的往返前进。当我到达底部的结果时,它没有进行任何数据库调用。我只是将这些值编组到视图模型中。

2 个答案:

答案 0 :(得分:3)

您正在推迟查询。试试这个:

return (from q in questions
                select new Models.SurveyQuestionViewModel
                {
                    Id = q.Id,
                    Question = q.Question,
                    LongDescription = q.LongDescription,
                }).ToList();

答案 1 :(得分:1)

快速解决方法是致电ToList()

return (from q in questions
                select new Models.SurveyQuestionViewModel
                {
                    Id = q.Id,
                    Question = q.Question,
                    LongDescription = q.LongDescription,
                });

这将使延迟加载短路并防止错误发生。

但是,IoC容器可以通过工作单元模式简化此问题,这非常适合Web。当HTTP动词触发时,您的上下文生动,当会话结束时,IoC处理控制器的处理。无需using或处理这些错误的麻烦。