ビューをテーブルに変換して変更を保存すると、オプティミスティック同時実行例外が発生します
-
12-12-2019 - |
質問
私は Entity Framework 4 (自己追跡エンティティを使用) を使用して作業しており、2 つのテーブルを結合したビューにアクセスしています。したがって、ビューの情報を更新するときは、データベースにアクセスするリポジトリにビューの STE を送信します。
私は次のことを行いました:
更新された情報を含むビューを受け取ったら、STE1 と STE2 を作成します。STE を作成すると、状態が追加されて作成されます。それで、ビューの STE の状態が変更されたことをどのようにして知るかというと、次のメソッドを使用して 2 つの STE の状態を変更します。 MarkedAsModified
.
次に、ビューの STE に 2 つのテーブルの情報をどのように入れるかというと、ビューからの情報を正しい STE に渡し、STE からの変更を objectContext
.
最後に私は saveChanges
. 。しかし、このステップでは、 Optimistic concurrency exception
. 。STEが州から渡されたからだと思います。 Added
に Modified
したがって、コンテキストは、作成と変更の間に何らかの変更があることを検出します。 SaveChanges
, 、しかし、私もしようとしています AcceptChanges
STE で、後で変更済みとしてマークされ、変更を適用して、最後に SaveChanges
, 、しかし問題は解決しません。
どうすれば問題を解決できますか?ビューと Entity Framework v4 を操作するより良い方法はありますか?
ありがとう。ダイムロック。
編集1:まだ問題があります。私のコードは次のとおりです。
コンポーネント myComponent = new Components();//これはstem mycomponent.rereference = myview.referenceです。...//その他のプロパティmycomponent.markedasmodified();//これは、新しいレジスタを追加するのではなく、情報を更新するために必要です。myContext.ApplyChanges("コンポーネント", myComponent);miContexto.SaveChanges();
saveChanges で例外が発生します。update、insert、または delete ステートメントが予期しない数の行 (0) に影響しました。エンティティがロードされた後に、エンティティが変更または削除された可能性があります。ObjectStateManager エントリを更新します。
どれが問題ですか?新しく作成した STE を変更することはできませんか?
ありがとう。
解決
問題を解決する方法を見つけました。
最初の解決策では、データベースにクエリを実行してデータベース内の既存のレジスタを取得することでした。これによりコンテキストにエンティティが追加され、データを変更して変更を正しく保存できるようになります。
しかし、後で、変更されたエンティティをコンテキストに追加するためにデータベースにクエリを作成する必要を回避する方法を見つけました。
方法は次のコードを使用します。
Customers myCustomer = new Customers { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);
//update the data of the entity.
myContext.SaveChanges();
解決策は、主キーを設定する新しいエンティティを作成することです。エンティティに FK がある場合、それは同じ方法で示されます。この時点で、エンティティには追加された状態が与えられます。
後でコンテキストにアタッチされ、変更できるようになります。フィールドが変更されると、エンティティの状態が変更済みに変更されるため、saveChanges() が呼び出されるとき、EF は新しいエンティティを追加しようとするのではなく、エンティティを更新します。
この情報はこの中にあります リンク. 。この記事では、データベースにエンティティを取得せずにエンティティを削除する解決策を示しますが、既存のレジスタを変更したい場合にもこのアイデアは機能します。