ADO.NET Data Servicesで更新
この間の続き。
画面に張り付けてとかはめんどくさいので取ってきていきなり更新してみる。
まずはこの間の復習も兼ねて、とってくるところ。
NorthwindEntities context = new NorthwindEntities(new Uri("http://localhost:56378/Northwind.svc", UriKind.Absolute)); var query = (from c in context.Customers where c.Country == "Mexico" select c) as DataServiceQuery<Customers>; query.BeginExecute(result => { IEnumerable<Customers> customers = query.EndExecute(result); List<Customers> customerList = customers.ToList(); dataGrid.ItemsSource = customerList; Update(context,customerList); }, null);
BeginExecute のコールバックの中で値を更新する Update メソッドを呼んでます。
ちなみに、クエリーを LINQ構文で書けたので変更してみました。DataServiceQuery
で、Updateメソッド。
private void Update(NorthwindEntities context, List<Customers> customers) { customers[0].City = "Tokyo"; context.UpdateObject(customers[0]); context.BeginSaveChanges(result => { DataServiceResponse response = context.EndSaveChanges(result); },null); }
1行目の City の値を無理やり Tokyo に変更して、 DataServiceContext の UpdateObject メソッドに渡してやります。それだけ。
あとは BeginSaveChanges を呼びだせば POST で Http リクエストが飛ばされて更新されます。楽チン楽チン。
でだ。
DataServiceContext には DeleteObject とか AddObject とかがあるんやけど、どうもうまく動いてくれない。HTTP リクエストが両方とも POST で投げられてしまうのです。そんで HTTP 500 エラーが発生してしまう。
もうちょいと調べなだめです。
あと、自動生成される Entity がなぜか INotifyPropertyChanged がついてません。 Pertial メソッドで変更が発生した時のメソッドを定義できるようにはしてあるんですが、わざわざ定義しなきゃだめです。ドーンととってきて、ドーンとバインドして、ドーンと変更したいのに、これじゃできません。微妙や。。。