Я настраиваю свой смоделированный DbContext после публикации здесь о stackoverflow, найденной здесь.

Это текущая установка ...

public static class DbContext
{
    public static MyDbContext Db
    {
        get
        {
            if (!HttpContext.Current.Items.Contains("_db"))
            {
                HttpContext.Current.Items.Add("_db", new MyDbContext());
            }
            return HttpContext.Current.Items["_db"] as MyDbContext;
        }
    }
}

Контекст размещается в global.asax на end_request следующим образом:

    void Application_EndRequest(object sender, EventArgs e)
    {
        var db = (MyDbContext)HttpContext.Current.Items["_db"];
        if (db != null)
            db.Dispose();
    }

Таким образом, во всей моей системе я могу получить доступ к базе данных, например DbContext.Db.xxxx

Пока у меня все работает отлично локально, однако я не тестировал с несколькими пользователями в производственной среде.

Мое беспокойство ...

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

2
99823 29 Янв 2014 в 22:35

1 ответ

Лучший ответ

Настройка в порядке ...

В моем решении не используется статический DbContext. DbContext (или что-то еще, что необходимо) хранится в коллекции HttpContext.Current.Items (которая является специфическим для текущего HTTP-запроса), и это свойство эквивалентно вызову метода, который извлекает контекст из этой коллекции и при необходимости создает его экземпляр. Эта коллекция была выбрана из-за ее безопасности и того факта, что на нее легко ссылаться практически из любого места (а именно из события Application_EndRequest), поэтому мы можем удалить ее, когда мы закончим.

Есть большая разница в публикации, на которую вы ссылаетесь, потому что она описывает ситуацию, когда вы используете static field. Очевидно, что это поле будет общим для всех пользователей, и это будет большой проблемой.

5
walther 30 Янв 2014 в 02:09
1
+1 вот это однозначно хорошо. Для этого предназначен контейнер Items.
 – 
Wiktor Zychla
30 Янв 2014 в 01:46
1
+1, «статический контекст» вообще не статичен. Вместо этого используется статический метод для создания или возврата контекста БД для текущего HTTP-запроса, в зависимости от ситуации.
 – 
Eric J.
30 Янв 2014 в 01:58