dbcontext извлекает старые данные и не обновляется

#c# #entity-framework #asp.net-mvc-3 #asp.net-mvc-4 #dbcontext

#c# #entity-framework #asp.net-mvc-3 #asp.net-mvc-4 #dbcontext

Вопрос:

Я инициализирую DbContext в своем контроллере, как показано ниже:

 public class BaseController : Controller
{
    protected KContext db;

    public BaseController()
    {
        db = new KContext();
    }
}
  

и я выполняю обычные операции добавления, редактирования, удаления в своих контроллерах, у меня также есть класс serviceChecker, который наследует реестр (от FluentScheduler), и у меня есть другой dbcontext, инициализированный там, как показано ниже:

 public class ServiceChecker : Registry
{
    KContext db;
    public ServiceChecker()
    {
        db = new KContext();
    }
}
  

и я проверяю некоторые таблицы в этом классе и редактирую некоторые объекты, которые также обновляются с моих контроллеров. Теперь проблема, с которой я сталкиваюсь, заключается в том, что после изменения объекта, назовем его полем serviceDoman endDate from 7/11/2014 to 7/11/2016 , он обновляет объект нормально, но когда servicechecker запускает функцию проверки (каждые 60 секунд), он должен обновлять другое поле этого объекта, что происходит нормально, но также изменяет endDate обратную 7/11/2014 сторонук (старое значение перед первым редактированием), что может быть причиной?

Комментарии:

1. Почему вы не используете по одному DbContext на запрос?

2. в моем классе контроллера или servicechecker? поскольку в контроллере он работает нормально, проблема возникает в моем классе servicechecker

3. Почему вы не используете по одному DbContext на запрос в обоих?

4. Я новичок в концепциях mvc, не могли бы вы указать мне правильное направление относительно одного DbContext на запрос? и может быть причиной моей проблемы?

5. @qujck Спасибо за ссылку, я понял это сейчас, хотя мне каким-то образом удалось решить проблему, я должен дать эту ссылку парню, который это реализовал 🙂

Ответ №1:

Возможная причина получения старых значений после обновления вашей сущности заключается в том, что вы не вызываете SaveChanges() метод для сохранения изменений сущности и создаете новый контекстный объект в ServiceChecker классе, который не имеет никакого представления об изменениях, которые вы внесли в сущность с вашим предыдущим (другим) контекстным объектом.

Одним из решений может быть вызов SaveChanges() метода после внесения изменений в объект.

Примечание: рекомендуется использовать общий контекстный объект для выполнения всех операций

Комментарии:

1. Нет, я использую шаблон репозитория usign здесь, и я вызываю свою функцию сохранения, которая вызывает SaveChanges() , я также проверяю обновленное значение, выполняемое контроллером, и оно обновляется, но именно тогда, когда serviceChecker вызывает функцию проверки, она использует старые данные, так или иначе, как dbcontext в моем serviceChecker не был обновленили что-то в этом роде … вроде как потеряно здесь

2. не могли бы вы дать мне совет по использованию общего контекста как для моего BaseController, так и для моего ServiceChecker? заранее спасибо

3. Создайте Base или AbstractRepository , в котором вы создаете свой контекст или DbContext объект и наследуете другой репозиторий из этого базового репозитория, делая это, вы создадите только один объект контекста в своем приложении. Я бы посоветовал вам использовать DbContext объект.

4. У меня уже есть базовый репозиторий, который принимает инициализированный dbcontext . по сути, я инициализирую dbcontext в своем контроллере или моем ServiceChecker, а затем передаю его в каждый репозиторий, и все они наследуются от моего базового репозитория. Я знаю, что эта концепция не самая лучшая, она была реализована другим парнем, и я вынужден просто исправить проблемы

5. Просто используйте внедрение зависимостей и позвольте какому-либо контейнеру управлять вашим жизненным DbContext циклом.