Как автоматически удалить класс ContextDB после выполнения любого запроса - PullRequest
0 голосов
/ 22 октября 2018

Проект ASP.NET MVC 5.

Я знаю, что лучше всего использовать объект контекста EF в качестве следующего

using(var context = new ContextDB())
{
}

Но я работаю с большим существующим проектом, который неиспользовал эту практику.проект, использующий следующий шаблон

public abstract class BaseService
{
    private static ContextDB _data { get; set; }
    public static ContextDB Data
    {
        get
        {
            if (_data== null)
                _data= new ContextDB();

            return _data;
        }
    }
}

На самом деле, из-за этого шаблона я получаю это исключение (иногда, не всегда)

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

Проблема в том, что это очень большая проблема.модификации, и мне не разрешат делать эту модификацию.

Вопрос, могу ли я решить эту проблему, не меняя тонны кода? Другими словами, могу ли я решить проблемы с изменениями, выполненными только внутри BaseService класс, например, есть ли какое-либо событие, которое я мог бы обработать, чтобы узнать, выполняется ли какой-либо запрос, и затем избавиться от ContextDB

, вот псевдокод идеи в моей голове

public abstract class BaseService
{

    public static ContextDB Data
    {
        get
        {
            ContextDB _data= new ContextDB();
            _data.SqlQueryExecuted += () => { this._data.dispose(); }
            return _data;
        }
    }
}  

ПРИМЕЧАНИЕ. Событие SaveChanged не подходит, поскольку не все запросы обновляются или вставляются.

1 Ответ

0 голосов
/ 22 октября 2018

Я могу использовать следующее решение.

  1. В запросе начала Global.asax: создайте экземпляр вашего dbContext.Сохраните его в HttpContext.Current.Items.

    Завершить запрос: захватить контекст и закрыть / удалить соединение.

  2. Другое лучшее решение - использовать DI.Внедрение зависимостей и ограничение объема вашего экземпляра.Есть много способов, как Singleton, PerRequest и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...