2011-03-22 50 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属性上的元数据文件中(如果发生了这种情况)。