問題タブ [objectstatemanager]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Entity Frameworkが、変更されたがリセットされたプロパティの変更を検出するのはなぜですか?
POCOエンティティのプロパティを変更したが、リセットした場合でも、EntityFrameworkは変更があることを示しています。
変更されたエントリ:
このケースをどのように処理しますか?
.net - 参照されたエンティティが、アタッチされたままではなく、コンテキストに追加されるのはなぜですか?
EntityState.Unchanged後で追加する新しいエンティティによって参照されるコンテキストにエンティティをアタッチしましたDbContext<T>.Add()。はエンティティを追加しますが、参照されているエンティティが以前は変更されていないコレクションに含まれていたにもかかわらず、追加されたコレクションにAdd()参照する他のエンティティも追加します。デバッガーの下に、両方のコレクションで参照されているエンティティが表示されます。そのため、参照された子エンティティで挿入が発生したくない場合は、挿入が発生することになります。ObjectStateManager
entity-framework - EF4 ObjectStateManagerは変更を報告しませんか?
EF4(データベースファースト)を使用して、コンテキストレベルで変更監査システムを実装しようとしています。、、またはコンテキストのSaveChanges状態を持つエンティティをオーバーライドしてキャプチャしています。これは通常は機能しますが、どのエンティティにもこの状態がない(コードで変更したエンティティを含む)という問題が発生しましたが、コンテキストにはデータベースへの変更があります。状態としてのエントリのリストを確認しましたが、変更したエンティティはそのリストに含まれています。AddedDeletedModifiedObjectStateManagerUnchanged
私が見ることができる唯一の問題は、自己追跡エンティティを使用していることです(これは、通常、変更のためにこれらのSTEをクライアントに送信するWCFサービスであり、クライアントは変更されたSTEのバックアップを渡して変更を永続化します) 。起こっているように見えるのは、サーバー上で取得され、そこで直接変更されたオブジェクト(クライアントに渡されてSTEを使用するのでObjectChangeTrackerはなく)がとしてマークされていないことModifiedです。これは正常/予期される動作ですか?この場合、変更が行われているときに、コンテキストがデータベースに保持する変更を決定するために、以外のものを使用していることは明らかです。ObjectStateManager
これらの変更を検出して追跡するにはどうすればよいですか?コンテキストが変更を追跡するために使用しているものを誰かが知っていますか?私はいつもそれがだと思っていましたObjectStateManagerが、そうではないようです。
entity-framework - Entity Framework 既存オブジェクトの更新
データベースに行を追加しましたが、更新するために別のコンテキストで戻ってきました。私はこのクラスを持っています:
C は EntityObject かもしれませんが、このクラスはそれを知りません。
私の保存は次のようになります。
等々...
私のテスト ケースでは、TryGetObjectStateEntry で stateEntry が見つかりません。ただし、これは EntityObject であり、新しいものではない (IsNew が私のフラグです) ため、else に移動します。ここに私の問題があります:set.Attachはこのエラーをスローします
「同じキーを持つオブジェクトが既に ObjectStateManager に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。」
そして次の瞬間に、ApplyCurrentValues はこれをスローします。
「提供されたオブジェクトのキーと一致するキーを持つオブジェクトが ObjectStateManager で見つかりませんでした。提供されたオブジェクトのキー値が、変更を適用する必要があるオブジェクトのキー値と一致することを確認してください。」
これらの両方がどのように真実である可能性がありますか?
詳しくは:
_item は別のコンテキストで Get によって作成されました。その後、そのコンテキストは破棄されました。その時点で、_item には EntityState.Unchanged がありました。それにいくつかの変更を適用したところ、EntityState.Modified に変更されました。(コンテキスト (およびその ObjectStateManager) がなくなっているはずだったので、私はそれを期待していませんでした。) とにかく、保存 (上記) に到達すると、状態は (デバッガーによって報告されたように) Modified ですが、私は持っていますそれまでに新しいコンテキスト。この時点ですべての ObjectStateEntries (Added、Deleted、Modified、Unchanged) のリストを取得した場合、ApplyCurrentValues が報告するように 2 つしかなく、_item はそれらの 1 つではありませんが、「それはそこにも!」。おそらく問題は、それがまだ古い ObjectStateManager にアタッチされていることです (ObjectStateManager を破棄させない参照があるでしょうか?)。
c# - 2 番目のデータを追加中に ObjectStateManager エラーが発生しました (Entity Framework)
複数の連続したデータを追加すると、SaveChanges() メソッドでエラーが発生しました。
EXCEPTION データベースへの変更は正常にコミットされましたが、オブジェクト コンテキストの更新中にエラーが発生しました。ObjectContext が矛盾した状態にある可能性があります。内部例外メッセージ: オブジェクトのキー値が ObjectStateManager 内の別のオブジェクトと競合するため、AcceptChanges を続行できません。AcceptChanges を呼び出す前に、キー値が一意であることを確認してください。
私のベースサービス
entity-framework - Entity Framework の ChangeTracker で複雑なプロパティを処理する
この投稿では、できる限り説明的になるように努めます。私の問題に周辺的に関連するSOの質問を1ダース以上読んだことがありますが、これまでのところ、何が起こっているのかと一致するものはありません.
したがって、データベース トランザクション (作成、更新、削除) で監査ログを実行するために、設計では次のように IAuditable インターフェイスを使用します。
3 つのコンテキスト ID は、ドメイン モデルのレイアウト方法に関連しており、前述のように、監査対象のエンティティに応じて、それらの一部またはすべてが null になる場合があります (これらは、管理者がアプリケーションの特定の範囲の監査ログ)。CUD アクションで監査する必要があるモデルは、このインターフェースを実装するだけで済みます。
監査テーブル自体が設定される方法は、ベース DbContext とドメインのコンテキストの間にある AuditableContext を使用することです。これには監査テーブル DbSets が含まれており、次のように EF ChangeTracker を使用して SaveChanges メソッドをオーバーライドします。
「監査レコードを作成する」プロセスは、リフレクションやその他の楽しいことを使用して、監査が必要なフィールドを抽出する少し複雑なコードです (監査可能なモデルがフィールドの一部を監査から「オプトアウト」する方法があります)。そしてそのすべて。
したがって、そのロジックはすべてうまくいっています。問題は、次のような監査可能なモデルがある場合に発生します。
指摘されているように、ほとんどの場合、これらのコンテキスト監査フィールドはモデルの標準プロパティにすぎません。ただし、ここのように、仮想複合プロパティからコンテキスト ID を取得する必要がある場合もあります。
これによりNullReferenceException、SaveChanges() メソッド内からそのプロパティを取得しようとすると、仮想 Bar プロパティが存在しないと表示されます。複雑なプロパティの遅延読み込みを可能にするために ChangeTracker がどのように構築されているかについて読んだことがありますが、それを正しく行うための構文が見つかりません。フィールドは「元の値」リストに存在せず、オブジェクト状態マネージャーにはこれらのフィールドがありません。これは、監査対象のエンティティではなくインターフェイスから取得されたためだと思います。
では、この奇妙な問題を回避する方法を知っている人はいますか? どうやら頑固な遅延読み込みの代わりに、仮想プロパティを含むオブジェクト全体の熱心な読み込みを強制することはできますか?
長い投稿で申し訳ありませんが、これは本当に具体的な問題であり、おそらく詳細が必要だと思います.
ティア!:)
entity-framework - オプティミスティック コンカレンシー例外はユーザー コードによって処理されました
Entity Framework 4.1 で MVC4 を使用しています。
最初に、データベースから Ado.net エンティティ モデルを作成しました。.edmx ファイルでは、特定のテーブルの主キーを持っていないため、データベース内の一部のテーブルが表示されません。
プロジェクトが進むにつれて、主キー フィールドを持たないログ テーブルの 1 つに更新する必要があります。
そのため、データベースを変更する代わりに、.edmx ファイルを変更しました。クライアントから、データベース フィールドを変更しないように依頼されました。.edmx を変更し、テーブル内の既存のフィールドの 1 つ (たとえば、tbl_logテーブル) に pk を作成しました。
tbl_log を更新しようとしています。しかし、次のようなエラーメッセージが表示されますStore update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.
スタック オーバーフローに関する多くの質問を見て、少しグーグルで調べましたが、解決策が見つかりませんでした。
私も ObjectStateManager エントリを更新しようとしましたが、それでも同じエラーを指しています。
これが私のコードです
助けてください
ありがとう、
カーシック
asp.net-mvc-3 - 同じキーを持つオブジェクトがobjectstatemanagerにすでに存在します
このエラーについて多くの質問がありますが、それでも私の問題を理解することはできません(多分私はこれに関する理論のいくつかをもっと必要とします)。
「同じキーを持つオブジェクトがobjectstatemanagerにすでに存在します」というエラーが発生し、実行しようとしていることは非常に単純です。電話のリストを含むクライアントの編集ビューがあります。ユーザーが[保存]ボタンを押すと、すべてをJsonでラップし、Ajaxでコントローラーに送信します。
コントローラーで、送信されたリストのどの電話を更新し、ニュースとして挿入し、削除する必要があるかを確認することになっています。
したがって、コードの重要な部分(および前述の例外をスローする部分)は次のとおりです。
ヘルプや提案はありますか?
さらに最悪の場合、残りのコードをテストするために例外をスローする行を削除し、SaveChangesの前の最後の行で別の例外をスローします。
アップデート:
私は、上記のルーチンを次のような別の形式で書き直すという問題の一部をなんとか解決しました。
現在残っている問題は、Proprietarioインスタンスを削除することだけです(TelefoneProprietarioのリストがあり、TelefoneProprietarioにはそれを所有するProprietarioへの参照があるためです。このシナリオでは、「2つのオブジェクト間の関係は、に接続されているため定義できません。ここSOで広く議論されているように、さまざまなObjectContextオブジェクト」...解決策を見つけようとしているので、私に何かを指摘できれば...)
entity-framework - ObjectStateManager 内に複数回存在するエンティティを見つける方法
こんにちは、次のエラーが表示されます。
オブジェクトのキー値が ObjectStateManager 内の別のオブジェクトと競合するため、AcceptChanges を続行できません。AcceptChanges を呼び出す前に、キー値が一意であることを確認してください。
今、私はそれを修正しようとしていますが、問題を引き起こしているエンティティを特定する必要があるので、どこを見ればよいかがわかります。
私はエラーが何であるかを知っており、それを解決する方法を知っていますが、どのエンティティが二重であるかを見つける方法がわかりません.