2016-08-31 3 views
0

私はユニバーサルWindowsアプリケーションにローカルSQLiteデータベースを持っており、ODataを使用してREST-APIサーバーにエンティティの変更をいくつか更新します。 私が使用してちょうど更新するとき:コンテキストは、現在のエンティティを追跡していないC#ODataデータベースから検索せずにuntrackedエンティティを更新しない

context.UpdateObject(entity); 
context.SaveChangesAsync(); 

私が言うエラーが出ます。

私はサーバーからエンティティを取得して更新して再度保存することができますが、サーバーから取得したローカルエンティティのすべての属性を手動でコピーする必要があることを意味します。 また、を更新するたびに、サーバーからエンティティ全体を読み取るのは効率的ではないと思います。

+0

[Entity Framework Updateの重複している可能性があります - コンテキストが現在エンティティを追跡していません](http://stackoverflow.com/questions/8547783/entity-framework-update-the-context-is-not-currently-tracking -the-entity) – Mark

+0

こんにちはマーク、私はそれが重複しているとは思わない、なぜなら、その回答では、私が避けたい参照問題を解決するためにデータベースクエリを使用するからです。 –

+0

どうやってそれを回収しましたか?彼らはそれを解決するためにクエリを使用していません、そのクエリの使用は、他の質問では問題です。 – Mark

答えて

1

エラーThe context is not currently tracking the entity.が言ったように、あなたのentityがあなたのcontextによって追跡されないという問題がありました。

contextあなたが付属サービスからpersonを取得することにより、あなたは(それに接続されているエンティティに対して行ったすべての変更を追跡します:tutorialから

、我々は実体がアップデートの下に、以下の注意事項を見つけることができますそれはに)SaveChangesが呼び出されたときに変更要求が送信されます。

デフォルトでは、クエリによって返されたエンティティが追跡されます。したがって、DataServiceContext.SaveChangesAsyncメソッドを呼び出すと、これらのエンティティの変更をデータサービスに返すことができます。しかし、クエリによってエンティティが取得されないため、SaveChangesAsyncメソッドを呼び出すときにこのエラーが発生します。

この問題を解決するには、DataServiceContext.AttachToメソッドを使用してエンティティをアタッチします。エンティティをアタッチするためにDataServiceContext.AttachToを使用すると、DataServiceContextはエンティティを追跡します。以下は簡単なサンプルです:

private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var context = new DefaultContainer(new Uri("http://services.odata.org/v4/(S(lqbvtwide0ngdev54adgc0lu))/TripPinServiceRW/")); 

    var person = new Person 
    { 
     UserName = "russellwhyte", 
     FirstName = "Jay", 
     LastName = "Zuo" 
    }; 

    context.AttachTo("People", person, "*"); 

    context.UpdateObject(person); 

    await context.SaveChangesAsync(); 

    var personUpdated = await context.People.ByKey("russellwhyte").GetValueAsync(); 

    System.Diagnostics.Debug.WriteLine($"{personUpdated.UserName} : {personUpdated.FirstName} {personUpdated.LastName}"); 
} 

詳細については、Client Trackingを参照してください。

+0

あなたは私の一日を保存しました、ありがとうございます!!!!!ドキュメンテーションに追加のものがあるかどうか尋ねることができます。 –

+0

ODataの[Getting Started](http://www.odata.org/getting-started/)と他のチュートリアル、特に[OData Client for .NET]チュートリアル[Microsoft ODataスタック](http:// odata)を読んでいます。 github.io/)。 –

関連する問題