0

Entity Framework 4(ODAC)でプログラミングするときにデータを安全に更新する方法を知りたいです。

void DescreaseInventory(int id, int qty){
  var order = (from o in context.Orders where o.ID ==id select o).FirstOrDefault;
  if( order != null ){
    if( ((Order)order).Qty < qty )
      throw new ApplicationException( "Not Enough Inventory!!" );
    else
      ((Order)order).Qty -= qty;
  }
  else{
  //...some code...
  }
  //will content.savechange
}

競合状態が発生すると、このコードは危険になります(数量チェックを回避します)。これを正しく行う方法を誰が知っていますか?

編集:EF4が追跡トークンとして列を作成するメカニズムを提供することを今私は知っています。しかし、Oracle DB(9i)でこの種の列を作成するにはどうすればよいかわかりません。適切な列タイプは何ですか?

4

1 に答える 1

1

楽観的同時実行性=データベースのrowversionまたはtimestamp列のいずれかを使用する。これらの列はデータベースによって維持され、レコードが更新されると自動的に値が変更されます。同時実行性チェックにこのような列を使用するようにEFモデルを正しく構成すると、いくつかの問題を回避できます。

1つのプロセスが注文を受け取ると、現在のタイムスタンプが読み込まれ、レコードを保存しようとすると、タイムスタンプは更新のWhere条件の一部になります。その間に別のプロセスによって順序が変更された場合、更新するレコードが見つからず、例外がスローされます。このような例外を処理するには、データベースからデータを更新して実際の状態と実際のタイムスタンプを取得します。たとえば、数量を再計算するか、ユーザーに解決のために渡します。

于 2012-06-14T08:31:25.453 に答える