2010-03-18 101 views
1

目前,我的網站基於MVC和針對SQL Server 2005數據庫運行的實體框架。到目前爲止,它一直運行得非常順利,我真的很喜歡MVC和它更簡潔的代碼(並沒有巨大的視圖狀態或靈魂破壞回發;))如何跨網站用戶共享實體框架模型

最近我正在升級網站使用簡單論壇系統,這是我開始遇到問題的地方。當我使用兩種不同的瀏覽器測試網站時,如果我在一個瀏覽器中創建或回覆了帖子,其他瀏覽器無法看到帖子。

目前,該網站的每位訪問者都獲得了他們自己的實體模型副本,我將其存儲在其會話數據中。很明顯,這是一個問題,因爲一個模型的更新沒有被轉移到另一個模型。

作爲一個測試,我嘗試存儲模型的一個副本,所有訪問者將該模型分配給一個靜態變量。這工作,兩個瀏覽器可以看到彼此修改。但是,它有其副作用。例如,如果我同時啓動了兩個瀏覽器並初始化模型,則一個瀏覽器會崩潰,另一個會正常工作,儘管我使用鎖定對象,理論上它們中的一個應該延遲到模型準備好了(當然,我可能已經實現了這個錯誤;))。此外,最初這個網站確實爲所有訪問者使用了一種模式,並且當它處於活動狀態時,它經常關閉 - 當它實現時,會終止IIS應用程序池。現在我不確定這是否有關係,但我不想重新引入導致此關閉的任何錯誤。

所以,我的問題確實很簡單 - 對所有網站用戶使用相同模型的最佳方式是什麼,以便他們都能看到更新,或者他們是否有單獨的副本(我想這些副本會有性能時間影響)模型如何檢測數據庫中的變化並根據其進行更新。

在此先感謝您的任何建議!

問候;
Richard Moss

回答

1

從每個請求的數據庫中獲取所需的數據。讓Web和/或ASP.Net緩存完成它的工作,而不是將數據置於會話狀態。

無論何時將新數據提交到數據庫,都可以在超時或通過代碼直接失效時執行緩存失效。

還有一些說明:當我說「在每個請求中獲得所需數據...」時,基於這樣一個事實,即從資源管理的角度來看,從您的數據庫中獲取數據數據庫需要它。在每個用戶會話狀態中存儲論壇數據的副本將迅速耗盡您的服務器內存(當然取決於用戶數量和數據大小)。另外,正如你經歷過的一樣,試圖讓這些副本與新的更改保持同步變得非常困難。同樣,每當你需要數據時去數據庫也可以解決這些同步問題。

所以要回答你的「什麼是最好的方式......」的問題:根本不存儲模型。數據上下文和模型應該只需要一個頁面請求即可生存。

現在,我提到了緩存,因爲這可能是您將數據置於會話狀態的原因。 EF不做緩存。我建議看看the ASP.Net caching features。這是緩存在頁面和html級別,這是更有效的資源。

+0

實體模型是否支持緩存?我認爲他們做了「聰明的東西」,比如生成SQL語句,只返回請求的數據 - 你應該如何緩存,我真的不知道。我從來沒有直接處理數據庫,一切都通過服務/存儲庫類到實體模型本身提供所有的數據訪問。 – 2010-03-18 18:59:42

+0

@richardmoss:補充說明一下。希望它實際上澄清:) – 2010-03-19 07:28:06

+0

彼得, 感謝您的信息,聽起來像我完全錯誤的方式,所以時間爲一些代碼雜耍和利用緩存。 再次感謝! Richard Moss – 2010-03-20 11:52:08

1

「每個訪問者的網站獲得自己的實體模型的副本,我存儲在他們的會話數據」

「當我在測試使用兩種不同的瀏覽器的網站,如果我在一個瀏覽器中創建或回覆帖子,其他瀏覽器無法看到帖子。「

等待第二個...

你把一個ObjectContext的到一個會話變量?這是一件很奇怪的事情。你確定你正在刷新你的數據庫更改嗎?