#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
циклом.