サーバー側で WebApi を使用するシック クライアント アプリケーション内で Breeze.Sharp を使用しています。EntityManager オブジェクトで ExecuteQuery を複数回呼び出すと、気になる問題があります。
ExecuteQuery 呼び出しによって返されたタスクが作成された順序で完了していない場合、EntityManager は変更されたエンティティの状態を変更できません。変更されたエンティティは常に Unchanged 状態のままになるため、SaveChanges 呼び出しで空白の応答が送信されます。
public Task<IEnumerable<SomeType>> GetSomeTypeAsync(string type)
{
EntityQuery<SomeType> query = new EntityQuery<SomeType>()
.Expand("Nav1,Nav2").Where(s => s.Type = type);
return entityManager.ExecuteQuery(query);
}
上記のコードは非常に簡単ですが、ループ内でこのメソッドを呼び出すと、一部の呼び出しが他の呼び出しよりも遅くなると、説明したように問題が発生します。
ソースを調べると、EntityManager はスレッドセーフではないようです。EntityManager オブジェクトには、これらの複数の ExecuteQuery 呼び出しを通過するときに True に設定されたままの内部ブール プロパティ IsLoadingEntity があり、すべてのタスクが完了した場合でも、このプロパティは false に戻されません。これにより、SaveChanges は何もしなくなります。
これは誰にとってもおなじみの音ですか?何か修正がありましたか、それとも完全に間違ったことをしていますか?