1

我在 Silverlight RIA WCF 服务应用程序中有以下代码:

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;
}

它用项目填充 Grid,但是context.Employees.Count() = 0. 为什么会这样?

另一个问题是我有一个针对基于另一个实体模型和数据库的不同域服务的另一个页面的类似代码。但在这种情况下,服务没有返回任何实体。这可能是什么原因?数据库不为空。

4

4 回答 4

4

这可能是因为 context.load 在您询问它的项目数时仍在加载。

尝试这个

var operation = context.Load(query);
operation.Completed += (s,ea) => 
{
    int count = operation.Entities.Count();
    EmployeeGrid.ItemsSource = operation.Entities.ToList();
}
于 2011-03-22T15:36:09.143 回答
3

context.Load(query) 是一个异步操作。它在后台的网络请求检索数据之前立即返回。您需要按照 Levisaxos 的回答中的指示侦听操作完成事件。

如果你连接了 operation.Completed 事件,但在上下文中仍然看不到任何数据,那么是时候将注意力转向服务器端的域服务了。在对应于 GetEmployeeQuery(可能是 GetEmployee)的域服务方法中设置一个断点,并确保它被调用。然后在模型中的实体集合属性中设置断点 - 可能在 mymodel.Designer.cs 属性 ObjectSet Employees 中,以查看实际检索到的数据。

于 2011-03-22T17:04:49.800 回答
1

正如其他人所提到的,这是因为 Load 是异步的,并且在没有任何数据的情况下立即返回。您需要响应 Load operations completed 事件。

您可以像@Levisaxos 所说的那样执行此操作并处理 Completed 事件,或者您可以将回调作为参数传递给 Load。当加载操作完成时,将执行此回调。

正如@Levisaxos 所说,连接到该事件也应该有效,但您应该记住再次取消订阅该事件,否则您会泄漏内存。

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

于 2011-03-22T17:19:15.577 回答
0

一种可能性是您没有将服务设置为在返回的数据中包含 Employee 表。为此,只需将 [Include] 属性添加到员工的Employees 属性上的元数据文件中(如果发生这种情况)。

于 2011-03-22T18:26:23.173 回答