0

我是實體框架4.0的新手,在C#中使用它,並且正在嘗試使用它的功能。實體框架4 - 在生成的實體中嵌入ObjectContext參考

我注意到,就像大多數類似的ORM一樣,它依賴於一個Context對象來處理在生成的實體上完成的數據操作和CRUD語句生成。

這意味着如果我想將更改保存回數據庫,我總是需要能夠訪問實例實例化的ObjectContext的引用。

如果上下文已經在可訪問的作用域(例如,同一個方法)中創建,那麼這很好,但如果我將實體或實體設置爲方法並希望此方法保存更改,該怎麼辦?它看起來像唯一簡單的方法是將ObjectContext與參數一起傳遞。

另一種解決方案是將ObjectContext放在某種全局變量中。不用說,我發現這兩種方法的樣式和可維護性問題。

總而言之,我能想象的最好方法是從實體或實體集合中獲取對ObjectContext的引用。 我知道這是不可能的默認情況下。

I have found a method顯示添加擴展方法從實體獲取ObjectContext。但是,它只適用於具有關係的實體,根據作者稱這種方法是昂貴的。

我正在考慮修改T4模板來爲所有實體添加一個Context屬性,並自動將其填充到實體的實例上。

我已經修改了T4模板,讓實體框架對我生成的類執行了最大長度(通過遵循Julie Lerman的編程實體框架4書)。 我不能說我真的很喜歡到目前爲止的T4語法,但如果這是最好的/唯一的方式,那就這樣吧...

有沒有人已經這樣做了,什麼是最好的方式來處理這個和願意分享他的T4模板或解釋什麼是最好的部分方法或事件掛鉤以完成這件事?

使用這種方法有什麼主要缺點嗎? 我在想如果ObjectContext有這麼多的引用可能會阻礙/延遲它被GC重新召集的能力,如果我的一些實體仍然在範圍內,但實際上我已經不再使用ObjectContext了。

非常感謝。

回答

0

如果您需要將對象上下文作爲參數傳遞給您的實體,那麼您做錯了事情。

通常情況下只有在定義良好的圖層中才需要。這個層需要上下文到邏輯的所有類都可以通過一些專門的類上下文提供者(它也可以稱爲服務定位器)來接收上下文。上下文提供程序將在某個存儲中保存當前上下文實例 - 您可以創建自己的或者可以按線程,按照http請求存儲它。

如果他們需要多於一個上下文實例,您可以修改您的提供程序也作爲工廠工作。

另一種常見方法是與依賴注入相結合。您將通過構造函數(或屬性)將上下文傳遞給您的類,並且您將擁有一些將爲您執行所有必要初始化的引導代碼(創建所需實例並將所有依賴關係傳遞給它們)。再次,您可以通過環境或工廠。這通常與IoC容器一起使用,它將爲您完成管道安裝。

準備好此基礎架構後,您可以將實體傳遞給該層中的任何初始化類,並且它將具有可用的上下文。