Можно ли сохранить состояние сеанса в существующей БД SQL Azure моего приложения ASP.NET MVC? - PullRequest
2 голосов
/ 10 августа 2011

Я использую EF4.1 в стиле первого кода для сохранения объектов POCO для небольшого веб-приложения на основе ASP.NET MVC 3 в базе данных SQL Azure «MyAppsDB».Таблицы автоматически создаются в MyAppsDB, когда они не существуют.Я хотел бы разместить приложение в SQL Azure, но я не хочу платить 10 долларов в месяц за дополнительную 1 ГБ БД для хранения 50 МБ состояния сеанса, а использование Cache будет еще дороже.

Я хотел бы сохранить состояние сеанса в MyAppDB вместе с моделями моего приложения.Есть ли способ сделать это?Могу ли я создать таблицу Session автоматически созданной, если она не существует, так же, как и модели с первым кодом EF?

Я попытался изменить свой файл web.config следующим образом:

<sessionState mode="Custom" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      connectionStringName="MyAppDBContext" applicationName="/" />
  </providers>
</sessionState>

Но он жалуется, что сеансовый стол не существует.Если я создаю таблицу сеансов, EF4.1 жалуется, что метаданные БД не соответствуют его ожиданиям.

1 Ответ

1 голос
/ 10 августа 2011

Конечно, можно использовать вашу существующую базу данных SQL Azure для состояния сеанса.Я делаю именно это (и по той же причине).Стандартные сценарии не работают, так как они не совместимы с SQL Azure.Где-то есть несколько обновленных скриптов (я не могу вспомнить, где, но у меня будет Google), которые я использовал для настройки БД.

Хотя это не код в первую очередь.Возможно, вы сможете выполнить обратный инжиниринг схемы, но при этом задействовано несколько хранимых процедур.

Обратите внимание, что вам также следует подумать о приведении в порядок сеансов с истекшим сроком действия.Есть хранимая процедура, которую нужно периодически запускать (я думаю, DeleteExpiredSessions), и типичная рекомендация - запускать ее из рабочей роли.Но вы не захотите развертывать рабочую роль с единственной целью периодического запуска хранимой процедуры!

Редактировать: Обнаружен скрипт на этой странице .Обратите внимание, что есть проблема со сценарием, опубликованным в основной статье, но есть модифицированный сценарий ниже по странице в комментарии от Питера МакЭвоя.

Некоторые рекомендуют использовать поставщика состояний сеанса хранилища таблиц Azure в предпочтении иесли бы я не использовал SQL Azure, я был бы склонен согласиться.Но у меня были проблемы с провайдером Azure (в частности, в среде разработчиков), но у меня вообще не было проблем с использованием состояния сеанса SQL Server после развертывания обновленных сценариев.

Редактировать 2: я сделал дальшепрогресс, и я напишу это для своего блога и опубликую ссылку здесь.

Основные моменты, хотя:

  • Запустите скрипт InstallSqlState.SQL (модифицированный для Azure)для пустой базы данных
  • Используйте EF Power Tools для обратного проектирования таблиц состояний ASP в EF Code-First
  • Интегрируйте классы обратного проектирования в вашу модель и контекст
  • Измените сопоставление для таблицы ASPStateTempSessions, чтобы использовать тип столбца Image
  • Создайте новый сценарий SQL из InstallSqlState.SQL, который просто создает хранимые процессы
  • Измените сохраненные процессы, чтобы всегда указывать значения по умолчанию
  • Добавьте некоторый код для запуска сценария SQL в метод Seed () Initializer

Я думаю, что это все, но я дамболее полное описание в моем блоге, когда я его написал.

Edit 3:

Часть I моей статьи теперь в моем блоге .Часть II скоро (но время спать).

Правка 4:

Часть II также написана, сейчас.

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