我玩弄實體框架,看看它如何在我正在使用的新項目中使用。我把我的edmx文件放在一個類庫中,這樣實體(和數據庫訪問)可以在多個地方使用。目前我有一個Web項目和一個控制檯項目,都引用了類庫。實體框架和ObjectContext參考
我的一個實體有一個用靜態方法定義的部分類。該方法的目的是接受一些參數並創建特定類的一個或多個實例。我的第一個版本的方法創建了一個ObjectContext實例,創建了實體類(或類),並將實體返回給調用方法。調用方法然後更新了一些屬性,並嘗試使用新的ObjectContext實例保存實體。顯然這不起作用,因爲實體被綁定(正確的術語??)到靜態方法中創建的上下文。
經過一番研究,我修改了靜態方法以接受ObjectContext引用,以確保創建的所有實體,然後使用相同的上下文進行操作和保存。這工作正常,但設計只是感覺不對。假設我的一個靜態方法可能增長得更多,或者我的應用程序(特別是Web應用程序)可能會從附加層(DAL甚至服務層)中受益,那麼這對所有這些類都有意義嗎?需要一個ObjectContext參數?
我讀過很多貼子,認爲通過Singleton模式創建ObjectContext是一個壞主意,因爲「許多客戶端會使用同一個對象」。我的問題是我不明白這是怎麼可能的。在本地控制檯應用程序中,只有一個用戶在運行該應用程序。在一個網絡應用程序中,每個請求只有一個用戶。用戶共享問題在哪裏?沒有一篇文章/文章提到它......但是它們指向在Application上下文中存儲對象實例的單例模式?
我也看到過關注web使用情況,並通過HttpContext對象將對象實例存儲在用戶Session對象中。這是有道理的,但似乎並未解決非Web使用問題。
我認爲無論什麼解決方案都適合(靜態方法,工廠對象等)很可能會在我的類庫中實現,所以顯然它需要同時支持Web和非Web解決方案。也許檢查HttpContext,以確定它運行在什麼樣的環境。
我希望http://www.west-wind.com/weblog/posts/2008/Feb/05/Linq-to-SQL-DataContext-Lifetime-Management會提供信息,但我很難包圍我的頭和示例代碼似乎是矯枉過正的實例化和共享一個簡單目的。 (雖然我相信我只是沒有得到它...)
任何想法都讚賞。
謝謝。
(部分)重複http://stackoverflow.com/questions/8927779/managing-entity-framework-objectcontext-in-aspnet – 2012-03-05 09:55:10