WCF Data Services を使用する Silverlight アプリケーションがあります。ロギング機能を追加したいと考えています。新しい行が生成されると、この新しい行の主キーもロギング テーブルに記録されます。行の生成とロギングは、同じトランザクション内で発生する必要があります。主キーは、データベースを介して (IDENTITY キーワードを使用して) 生成されます。
これは、例を使って説明するのが一番良いかもしれません。ここでは、新しいCustomer行を作成し、同じトランザクションで Customer の主キーをAuditLog行に書き込みます。この例では、シック クライアントと Entity Framework を使用しています。
using (var ts = new TransactionScope())
{
AuditTestEntities entities = new AuditTestEntities();
Customer c = new Customer();
c.CustomerName = "Acme Pty Ltd";
entities.AddToCustomer(c);
Debug.Assert(c.CustomerID == 0);
entities.SaveChanges();
// The EntityFramework automatically updated the customer object
// with the newly generated key
Debug.Assert(c.CustomerID != 0);
AuditLog al = new AuditLog();
al.EntryDateTime = DateTime.Now;
al.Description = string.Format("Created customer with customer id {0}", c.CustomerID);
entities.AddToAuditLog(al);
entities.SaveChanges();
ts.Complete();
}
Entity Framework を使用してシック クライアントを開発する場合、これは些細な問題です。
ただし、Silverlight および ADO.NET データ サービスを使用すると、次のようになります。
- SaveChanges は非同期でのみ呼び出すことができます
- TransactionScope が利用可能かどうかわかりません
- 生成されたキーをクライアントに反映できるかどうかはわかりません編集: Alex Jamesによると、それらは実際にクライアントに反映されます
それで、これは可能でしょうか?