2011-03-22 49 views
1

我在Silverlight的RIA WCF服務的應用程序下面的代碼域名服務:問題與Silverlight的

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    EmployeesService2 context = new EmployeesService2(); 
    EntityQuery<Employee> query = context.GetEmployeeQuery(); 
    context.Load(query); 
    int count = context.Employees.Count(); 
    EmployeeGrid.ItemsSource = context.Employees; 
} 

它填充網格項目,但context.Employees.Count() = 0。這是爲什麼?

另一個問題是,我有一個類似的代碼針對另一個頁面針對不同的域服務,其中 基於另一個實體模型和數據庫。但在這種情況下,該服務沒有返回任何實體。這可能是什麼原因?數據庫不是空的。

回答

4

這可能是因爲context.load在您要求計算它的項目時仍然在加載。

試試這個

var operation = context.Load(query); 
operation.Completed += (s,ea) => 
{ 
    int count = operation.Entities.Count(); 
    EmployeeGrid.ItemsSource = operation.Entities.ToList(); 
} 
+0

不,它不是... – Peter17 2011-03-22 15:40:43

+1

Peter通過WCF RIA Services訪問所有數據是異步的;你需要遵循的模式是使用上面的lambda方法或添加一個事件處理函數(我更喜歡lambdas)。 – 2011-03-22 18:24:15

3

context.Load(查詢)是一種異步操作。它在引擎蓋下的網絡請求檢索數據之前立即返回。您需要聽取Levisaxos答案中所示的操作完成事件。

如果您連接了operation.Completed事件並且仍然沒有在上下文中看到任何數據,那麼現在是時候將注意力轉向服務器端的域服務。在對應於GetEmployeeQuery(可能是GetEmployee)的域服務方法中設置一個斷點並確保它被調用。然後在模型中的實體集合屬性中設置斷點 - 可能位於mymodel.Designer.cs屬性ObjectSet Employees中,以查看實際正在檢索的數據。

1

其他人提到,這是因爲負載是異步並立即返回沒有任何數據。您需要響應Load操作已完成的事件。

您可以這樣做,因爲@Levisaxos說和處理Completed事件,或者您可以將回調作爲參數傳遞給Load。這個回調將在Load操作完成時執行。

作爲@Levisaxos說的話應該可以工作,但你應該記得再次取消訂閱活動,否則你會泄漏記憶。

http://forums.silverlight.net/forums/p/129624/296266.aspx

0

一種可能性是,你沒有你的服務設置爲包括在返回的數據Employee表。要做到這一點,只需將[Include]屬性添加到員工的Employees屬性上的元數據文件中(如果發生了這種情況)。