Использование операторов в веб-API

Я нашел этот код здесь

   using (var objCtx = new SchoolDBEntities())
{
    var schoolCourse = from cs in objCtx.Courses
                       where cs.CourseName == "Course1"
                       select cs;
    Course mathCourse = schoolCourse.FirstOrDefault<Course>();
    IList<Course> courseList = schoolCourse.ToList<Course>();

    string courseName = mathCourse.CourseName;
}

И я использую его в методе Get веб-API. Когда я использую оператор using, я получаю следующую ошибку: Экземпляр ObjectContext удален и больше не может использоваться для операций, требующих подключения

Я не использую его, тогда как мне ответственно избавиться от объекта контекста?


person Nick    schedule 30.01.2014    source источник
comment
Это может быть удобно: stackoverflow.com/questions/18398356/ Можете ли вы опубликовать свои классы EF, если вы используете простые старые объекты Clr (POCO)?   -  person Jason Evans    schedule 30.01.2014


Ответы (1)


Я использую что-то подобное, чтобы решить проблему, не прибегая к активной загрузке (на самом деле обычно в общем абстрактном базовом контроллере, который я расширяю, но этот пример упрощен):

public class MyController : ApiController
{
    private SchoolDBEntities _objCtx;

    // Singleton ObjectContext
    protected SchoolDBEntities objCtx
    {
        if(_objCtx == null) _objCtx = new SchoolDBEntities();
        return _objCtx;
    }

    // Use singleton objCtx without using wrapper here, in Get() or other methods.
    public String Get()
    {
        var schoolCourse = from cs in objCtx.Courses
                   where cs.CourseName == "Course1"
                   select cs;
        Course mathCourse = schoolCourse.FirstOrDefault<Course>();
        string courseName = mathCourse.CourseName;
        return courseName
    }

    // ApiController implements IDisposable, so you can override Dispose to do clean-up here.
    // This is not called until the controller is disposed, so you won't get the error you report.
    protected override void Dispose(Boolean disposing)
    {
        if (_objCtx!= null)
        {
            _objCtx.Dispose();
            _objCtx = null;
        }
        base.Dispose(disposing);
    }

}
person Jude Fisher    schedule 30.01.2014