2012-10-02 75 views
1

我目前正在閱讀70-516考試(訪問數據)的自定進度培訓工具包,我正在閱讀關於實體框架的章節。實體框架使用WCF的ObjectContext生命週期Ria

我在談論ObjectContext並且它繼承IDisposable進行清理的一點。這提出了幾個問題,我似乎無法在研究時得到確切的答案。我只是想了解事情是如何運作的。


場景: 我使用WCF RIA和Entity Framework創建一個Silverlight應用程序,並使用MVVM精簡版模式。我做了我的EDMX並創建了一個名爲FamilyService的域服務,我在Silverlight應用程序中將它用作FamilyContext。我創建了一個名爲GetFamilyMembers的方法,該方法返回FamilyMember表中的數據。

[EnableClientAccess()] 
public partial class FamilyService : LinqToEntitiesDomainService<FamilyEntities> 
{ 
    public IQueryable<FamilyMember> GetFamilyMembers() 
    { 
     return this.ObjectContext.FamilyMembers; 
    } 
} 

在ViewModel中,我創建了一個FamilyContext的實例,並在清理時將其清零。


1)當我無效FamilyContext對象時,它是否對服務器上的ObjectContext執行任何操作?我問這是因爲我從來沒有在域服務中手動創建或處理它。

2)我明白,當我在Entity Framework中運行查詢時,它會緩存數據。在RIA場景中,在客戶端應用程序的FamilyContext上執行數據緩存還是駐留在服務器上的ObjectContext上?我只是好奇ObjectContext是否擁有緩存,因爲我的應用程序中的每個視圖模型都創建了它自己的FamilyContext實例,想知道是否清除了視圖模型,但是仍然可以利用緩存。

在此先感謝。

+1

你不創建或處理'ObjectContext'?怎麼可能? –

+0

我不手動做到這一點,我假設它在LinqToEntitiesDomainService基類中?更新問題 –

回答

0

您需要區分一點。

DomainService(你的FamilyService)是服務器邏輯的一部分,並且所述服務的一個實例將在每次創建一個請求/方法調用(如QueryUpdateInsertDeleteInvoke)是在你的服務進行。這由ASP.NET/WCF RIA Services運行時完成。

如果你想控制如何創建DomainServices的實例,你需要實現你自己的DomainServiceFactory。但這是一個高級的場景。

因此,每個請求都會獲得自己的實例DomainService,因此DomainService也會有自己的實例ObjectContext。當調用完成時,ObjectContext被處置。在此場景中的緩存僅在請求期間多次查詢ObjectContext時發生。

A DomainContext是一個域服務的有狀態的客戶端表示,提供對服務的所有功能的訪問。它提供了一個緩存(aka.EntityCollections),其中包含從DomainService加載的實體。緩存也用於更新或刪除加載的實體並插入新的實體。需要提交緩存中的更改,以便在DomainService上調用相應的方法來更新,刪除或插入實體。

您的DomainContext的實例是使用類的構造函數創建的,通常由您創建並清理DomainContext的實例。因此,將DomainContext設置爲null將不會在服務器端進行任何操作。

+0

謝謝,我相信你已經清除了這一點。爲了仔細檢查,我的每個viewmodel的FamilyContext(在vm的構造函數上創建,並且清除了vm的清除事件)具有基於它自己對域服務的調用的獨立的客戶端數據緩存。在每次調用時,域服務創建一個objectcontext的實例,使用它,然後將其處理掉,這樣ObjectContext上的所有緩存數據就會消失。所以總而言之,我應該善於清理,因爲域服務處理服務器端對象,而且我正在手動清理我的客戶端FamilyContext。聽起來不錯? –

+0

@ user1713224:是的,你是對的。 – Jehof