1

SilverlightRIAWCFサービスアプリケーションに次のコードがあります。

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

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

他の人が言っているように、それはロードが非同期であり、データなしですぐに戻るためです。Loadoperationscompletedイベントに応答する必要があります。

@Levisaxosが言ったようにこれを実行して、Completedイベントを処理するか、Loadへのパラメーターとしてコールバックを渡すことができます。このコールバックは、ロード操作が完了したときに実行されます。

@Levisaxosが言ったようにイベントに接続することも機能するはずですが、イベントから再度退会することを忘れないでください。そうしないと、メモリがリークします。

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

于 2011-03-22T17:19:15.577 に答える
0

1つの可能性は、返されるデータにEmployeeテーブルを含めるようにサービスが設定されていないことです。これを行うには、employeeのEmployeesプロパティのメタデータファイルに[Include]属性を追加します(これが発生している場合)。

于 2011-03-22T18:26:23.173 に答える