最初にEF 5データベースを使用してMVC 4 Webアプリケーションをプログラミングしています。適切な解決策を見つけることができない、明らかに些細な問題がいくつかあります。これらの問題は、オブジェクト状態マネージャーにあります。
最も単純なシナリオでは、すべて正常に動作します。Find を使用してデータベースからエンティティを読み取り、それらをビューに配置し、応答を待ち、エンティティを再構成し、Attach、EntityState.Modified、および SaveChanges を使用して書き戻します。リクエストの処理中にデータベースからエンティティをもう一度取得すると、問題が発生します。
1.何らかの
理由で元のエンティティの値を確認したい。
2. エンティティを識別するため、一部の値は変更できません。DisplayFor を使用して、参照用にこれらをビューに入れました。もちろん、再構成されたモデルにはこれらの値はありません。データベースから元のエンティティを取得し、コントローラーで TryUpdateModel を使用してビューのモデルとマージします。
Attach を呼び出すと、「同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。」という例外が発生します。
Context.Entry(t).CurrentValues.SetValues(t);
の代わりに使用するとDbSet.Attach(t);
、次の例外が発生します。
Member 'CurrentValues' cannot be called for the entity of type 'Price' because the entity does not exist in the context. To add an entity to the context call the Add or Attach method of DbSet<Price>.
私が理解しているように、特定のキーを持つエンティティには 2 つのインスタンスがあります。保存したいものを作成し、存在するものを置き換えたいと思います。これを自動的に、つまり、交換する必要のある別のものがすでに存在するかどうかを通知する必要がないようにしたいと考えています。
これを達成する方法はありますか?