1

私はEntityFramework4(自己追跡エンティティを使用)を使用していて、2つのテーブルのマージであるビューにアクセスしています。したがって、ビューの情報を更新するときは、データベースにアクセスするリポジトリにビューのSTEを送信します。

私は次のことをしました:

更新された情報を含むビューを受け取ったら、STE1とSTE2を作成します。STEを作成すると、状態が追加されて作成されます。したがって、ビューのSTEの状態について、状態が変更されていることをどのように知るか、メソッドを使用して2つのSTEの状態を変更しMarkedAsModifiedます。

次に、ビューのSTEに2つのテーブルの情報がどのようにあるか、ビューからの情報を正しいSTEに渡し、STEからの変更をに適用しますobjectContext

最後に私はを作りますsaveChanges。しかし、このステップで私はを受け取りますOptimistic concurrency exception。これは、STEが状態からに渡さAddedれるModifiedため、コンテキストが作成と作成の間に何らかの変更があることを検出するためだと思いますが、後で変更済みとしてマークされたSTEでSaveChanges試行しAcceptChanges、変更を適用して最後SaveChangesに、問題は解決しません。

どうすれば問題を解決できますか?ビューとEntityFrameworkv4を操作するためのより良い方法はありますか?

ありがとう。ダイムロック。

編集1:私はまだ問題があります。私のコードは次のとおりです。

コンポーネントmyComponent=new Components(); //これはSTEですmyComponent.Rereference=myView.Reference; ... //その他のプロパティmyComponent.MarkedAsModified(); //これが必要なのは、新しいレジスタを追加するのではなく、情報を更新したいからです。myContext.ApplyChanges( "Components"、myComponent); miContexto.SaveChanges();

saveChangesで、例外が発生します。update、insert、またはdeleteステートメントが予期しない行数(0)に影響しました。エンティティがロードされてから、エンティティが変更または削除された可能性があります。ObjectStateManagerエントリを更新します。

どちらが問題ですか?作成した新しいSTEを変更できませんか?

ありがとう。

4

1 に答える 1

1

私は問題を解決する方法を見つけました。

最初の解決策では、データベースにクエリを実行して、データベース内の既存のレジスタを取得することでした。これにより、コンテキストにエンティティが追加され、データを変更して、変更を正しく保存することができます。

しかし後で、変更されたエンティティをコンテキストに追加するためにクエリをデータベースにする必要を回避する方法を見つけました。

方法は次のコードを使用しています。

Customers myCustomer = new Customers  { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);

//update the data of the entity.

myContext.SaveChanges();

解決策は、主キーを設定する新しいエンティティを作成することです。エンティティがFKを持っている場合、同じ方法で示されます。この時点で、エンティティには追加された状態があります。

後で、コンテキストにアタッチされ、変更できます。フィールドが変更されると、エンティティはその状態を変更済みに変更します。そのため、saveChanges()が呼び出されると、EFはエンティティを更新し、新しいエンティティを追加しようとはしません。

この情報はこのリンクにあります。この投稿での解決策は、データベースに取得せずにエンティティを削除することです。既存のレジスタを変更する場合は、アイデアも機能します。

于 2012-05-26T08:44:49.633 に答える