|
在Kooboo中使用了Entity Framework作為持久化框架,但由于EF1.0并沒(méi)有提供完整緩存解決方案,一直以來(lái)都在為數(shù)據(jù)緩存而煩腦,在沒(méi)有找到合適解決方案的情況下,采取了臨時(shí)的解決辦法:直接緩存實(shí)體。但是由于Entity實(shí)體都是帶狀態(tài)的,并且都與ObjectContext有間接的反向引用,緩存帶狀態(tài)的實(shí)體,會(huì)造成對(duì)象上下文混亂和連接資源的無(wú)法被正確釋放。因此緩存的Entity實(shí)體,首先必須被分離或者重新定義POCO實(shí)體來(lái)代替Entity實(shí)體作為緩存對(duì)象。這樣一來(lái),所有的緩存實(shí)體的關(guān)聯(lián)關(guān)系都會(huì)失效,造成使用上的麻煩和整個(gè)軟件框架存在嚴(yán)重的不足。
再說(shuō)說(shuō)EF的SQL日志問(wèn)題。在之前的LINQ TO SQL的項(xiàng)目中,有一個(gè)可視化的調(diào)試器,可以查看查詢(xún)表達(dá)式生成對(duì)應(yīng)的SQL語(yǔ)句,這種可以大大方便開(kāi)發(fā)人員的調(diào)試工作。可以在EF1.0中,卻一直也找不到類(lèi)似可用的工具。因此,我的做法是通過(guò)SQL Profile來(lái)查看EF生成和執(zhí)行的SQL語(yǔ)句。雖然可行,但還是很不方便。
現(xiàn)在,EF團(tuán)隊(duì)終于推出一套比較完整的緩存和SQL執(zhí)行日志的解決方案,EFProviderWrappers。他們的做法是在原來(lái)的EF Provider之上,再加一層包裝,通過(guò)這層包裝攔截,進(jìn)行數(shù)據(jù)緩存和日志監(jiān)控。這里緩存的數(shù)據(jù)是數(shù)據(jù)庫(kù)查詢(xún)后返回的原生數(shù)據(jù),并不是Entity實(shí)體對(duì)象,這樣就可以避免Entity實(shí)體狀態(tài)對(duì)緩存造成的的極端負(fù)面影響。并且這樣的緩存對(duì)上層的數(shù)據(jù)查詢(xún)本身是透明,在同一個(gè)封閉區(qū)間內(nèi),緩存數(shù)據(jù)所依賴(lài)的實(shí)體類(lèi)型在被更新后(對(duì)應(yīng)的表有發(fā)生CURD操作),緩存并會(huì)被自動(dòng)清空。對(duì)于日志的監(jiān)控,經(jīng)過(guò)這層包裝后就可以非常容易得到處理。
上面的圖雖然是說(shuō)明對(duì)SqlClient有效,但由于這層包裝并不涉及具體的SQL操作,因此對(duì)不同的數(shù)據(jù)的Provider應(yīng)該都是有效。下面通過(guò)一個(gè)自帶的實(shí)例簡(jiǎn)單介紹一下如何使用。
在下載的EFProviderWrappers解決方案中,EFProviderWrapperToolkit,EFCachingProvider,EFTracingProvider這三個(gè)工程是真正干事的,其它的工程都是示例工程。在EFProviderWrapperDemo工程,我們可以找到我們所要的例子。
第一步:在配置文件中添加如下配置:
<system.data>
<DbProviderFactories>
<add name="EF Caching Data Provider"
invariant="EFCachingProvider"
description="Caching Provider Wrapper"
type="EFCachingProvider.EFCachingProviderFactory, EFCachingProvider,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
<add name="EF Tracing Data Provider"
invariant="EFTracingProvider"
description="Tracing Provider Wrapper"
type="EFTracingProvider.EFTracingProviderFactory, EFTracingProvider,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
<add name="EF Generic Provider Wrapper"
invariant="EFProviderWrapper"
description="Generic Provider Wrapper"
type="EFProviderWrapperToolkit.EFProviderWrapperFactory, EFProviderWrapperToolkit,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
</DbProviderFactories>
</system.data>
NET技術(shù):Entity Framework 緩存處理與日志監(jiān)控,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。