Как я могу поделиться моделью структуры сущности среди пользователей сайта - PullRequest
1 голос
/ 18 марта 2010

В настоящее время мой сайт основан на MVC и Entity Framework, работающем с базой данных SQL Server 2005. Пока что все работает очень гладко, и мне очень нравится MVC и его более тонкий и лаконичный код (и никаких огромных представлений или разрушающих душу постбэков;))

Недавно я работал над обновлением сайта для использования простой системы форумов, и именно здесь я столкнулся с проблемами. Когда я тестировал сайт с использованием двух разных браузеров, если я создал сообщение или ответил на него в одном браузере, другой браузер не смог увидеть сообщение.

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

В качестве теста я попытался сохранить одну копию модели, к которой все посетители могли бы получить доступ, назначив модель статической переменной. Это сработало, и оба браузера могли видеть модификации друг друга. Однако у него были свои побочные эффекты. Например, если я запустил оба браузера одновременно и модель была инициализирована, один браузер завис бы, а другой работал бы нормально, несмотря на то, что я использовал блокирующий объект, поэтому в теории один из них должен был быть отложен до модели был готов (конечно, я мог бы реализовать это неправильно;)). Кроме того, первоначально этот сайт использовал одну модель для всех посетителей, и когда он был активен, он часто закрывался - убивая пул приложений IIS, пока он работал. Теперь я не уверен, было ли это связано, но я действительно не хочу повторно вводить какую-либо ошибку, которая у меня была из-за этого.

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

Заранее спасибо за любой совет!

С уважением,
Ричард Мосс

Ответы [ 2 ]

1 голос
/ 19 марта 2010

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

и

"Когда я тестировал сайт с использованием двух разных браузеров, если я создал сообщение или ответил на него в одном браузере, другой браузер не смог увидеть сообщение."

Подождите секунду ...

Вы помещаете ObjectContext в переменную Session? Это довольно странная вещь. Вы уверены, что сбрасываете изменения в базу данных?

1 голос
/ 18 марта 2010

Получите необходимые данные из базы данных по каждому запросу. Пусть веб-и / или ASP.Net-кэширование выполнят свою работу вместо перевода данных в состояние сеанса.

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

Еще одно уточнение: когда я говорю «получать необходимые данные ... по каждому запросу», это основывается на том факте, что с точки зрения управления ресурсами более рентабельно получать данные из базы данных когда вам это нужно. Хранение копии данных форума в состоянии каждого пользователя быстро истощит ваш сервер памяти (в зависимости от количества пользователей и размера данных, конечно). Кроме того, как вы сами испытали, попытка синхронизировать эти копии с новыми изменениями становится очень сложной. Опять же, обращение к базе данных, когда вам нужны данные, решает и эти проблемы синхронизации.

Итак, чтобы ответить на ваш вопрос "как лучше ...": не храните модель вообще. Datacontext и модель должны жить только столько времени, сколько необходимо для одного запроса страницы.

Теперь я упомянул кеширование, потому что, возможно, именно поэтому вы в первую очередь переводите данные в состояние сеанса. EF не делает кеширование. Я предлагаю взглянуть на особенности кэширования ASP.Net . Это кэширование на уровне страницы и html, которое намного более эффективно использует ресурсы.

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