kubibay Ответов: 1

Ручные изменения БД шаблона репозитория не отражаются


У нас есть проект MVC, который написан на c#. Мы используем entity framework для подключения к sql db.
Я использую шаблон репозитория с реализацией сервиса в нашем проекте. Ручные обновления БД не отражают получение запросов репозитория. Как я могу заставить ef получить последние данные?

private readonly ICompanyService companyService;
        public HomeController(ICompanyService companyService)
        {
            this.companyService = companyService;
        }
companyService.Get(id) -> this doesnt return updated company

Я обновил компанию из БД, пока приложение работает.
Если я звоню в компанию с помощью этого метода, обновленные данные не возвращаются.

Это работает только с этим способом;
ServiceFactory.Services.CompanyService.Get(id)


ServiceFactory-> CompanyService is
private ICompanyService _companyService;
        public ICompanyService CompanyService
        {
            get
            {
                return _companyService ?? (_companyService =
                    new CompanyService(dbFactory, companyRepository, companyCustomerRepository,
                    regionCountryRepository, countryRepository, zoneRepository, unitOfWork));
            }
        }


Что я уже пробовал:

Я могу сделать это только без использования реализации сервиса

CHill60

Как мы можем помочь вам, если мы не знаем, на каком языке вы закодированы, какой код вы написали, какую базу данных вы используете?

Вы не дали нам абсолютно никакой полезной информации!

kubibay

я добавил детали, спасибо
Я предположил, что это, возможно, известная проблема, и для ти может быть быстрый ответ.

F-ES Sitecore

Это невозможно сказать из кода, который вы разместили. Используйте отладчик для пошагового просмотра кода строка за строкой, чтобы понять, почему вы не получаете новые данные из базы данных. Я предполагаю, что вы где-то кэшируете данные и возвращаетесь из этого кэша, а не из базы данных.

1 Ответов

Рейтинг:
10

Richard Deeming

Это звучит так, как будто вы используете один DbContext экземпляр по всему приложению.

После того как объект был загружен a DbContext например, он будет кэшироваться в течение всего срока службы этого экземпляра. Любая попытка прочитать эту сущность из этого экземпляра вернет кэшированное значение, игнорируя любые изменения в базе данных, если только вы вручную не принудительно обновите ее с помощью трекера изменений.

Перебор Кэша Entity Framework | Codethug[^]

Для веб - приложения вы должны использовать новый DbContext экземпляр по запросу. Как вы это сделаете, будет зависеть от того, какой контейнер IoC вы используете.


kubibay

Да, я использую SingleInstance dbfactory,репозиториев и сервисов.
Но когда я использую InstancePerRequest, то он увеличивает 100 мс для каждого запроса.
Поскольку мы не хотим, чтобы продолжительность запросов увеличивалась, я отказался от использования реализации сервиса.