0

Silverlight 5 の Entity Framework で RIA サービスを使用しています。次のFoo表があります。

Fooid
FooName
FooCode
FooRef

Fooid自動インクリメント番号 - 保存時にチャームのように機能します...
FooNameViewModel で設定されます - 保存時に正常に動作します...
FooCodeGRN、SIP、XYZ などの 3 文字のコードです ... これも ViewModel で設定されます。 .
FooRef増加する整数は問題ありません。たとえば、サーバーに最後に保存された値は 100 で、次の保存は 101 になります。

この最新の番号を取得する方法について少し混乱しています。少し調べたところ、2つの方法が見つかりましたが、これらの使用方法が混乱しており、実装方法の助けが必要です。

First Method
FooRefViewModel から、最後に保存されたint を提供できる RIA サービスから INVOKE を呼び出すことができます。1 ずつ追加して、SubmitChanges に値を渡すことができます。
Problem with First Method :この方法で私が直面する問題は、異なる場所のワークステーションに 3 人のユーザーがいるとしましょう。それらはすべて newFooの作成を開始し、invoke メソッドを呼び出すと、すべて同じ値が与えられ、概念全体が崩壊します。

Second Method
私はどういうわけかサーバー上の Add メソッドをインターセプトし、リポジトリ経由である可能性があり、FooRefこのエンティティを追加して変更を送信する直前の値を取得します。

誰でも助けることができますか?

4

2 に答える 2

0

ID を推測して付与するのではなく、データベースが Foo レコードに ID を割り当てられるようにする必要があります。マルチユーザー システムではほとんど不可能な作業です。

WCF RIA サービスを使用してエンティティを保存する場合、次の方法で割り当てられた ID を取得できます。

riaContext.SubmitChanges ( (op) =>
  {
    if (!op.HasError)
    {
      var identityAdded = ((Entity) op.ChangeSet.FirstOrDefault()).GetIdentity();
    }
  }
于 2012-07-03T16:52:09.543 に答える
0

最後に、Invoke メソッドを使用し、呼び出しコールバック関数で、コンテキストをサーバーに送信しました。

context.GetAssignedFooRef((op =>
        {
          entityNewFoo.FooRef = op.Value; // assign return int to FooRef

          context.Foo.Add(entityNewFoo);
          context.SubmitChanges();
         }

これが私の問題への取り組み方です。それが理想的な解決策なのか、それに近いのかはわかりませんが、うまくいきます。私が直面する唯一の問題は、最初のユーザーが保存される前に、別のユーザーが呼び出しから FooRef を探している場合です。ここで検証が開始され、データベースに同じ FooRef が存在する場合、新しい FooRef を要求します。

于 2012-07-10T01:23:49.710 に答える