4

純粋なPOCOで実装されたEntityFramework4.0モデルがあります(コード生成なし、自己追跡エンティティなし、単純な古いCLRオブジェクトのみ)。

さて、これが私がUPDATEを実行するために私のUIに持っているいくつかのコードです:

[HttpPost]
public ActionResult UpdatePerson(Person person)
{
    repository.Attach(person);
    unitOfWork.Commit();
}

基本的に、強い型のPersonオブジェクトを受け入れるアクションメソッドがあり、このエンティティを更新する必要があります。

エラーは発生しませんが、DBへの変更も保持されません。:(

作業ユニットの「コミット」中にEntityStateを検査すると、次のようになります。

var entities = ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged);

EntityState.Unchangedでエンティティが表示されます。

それで、それが持続されなかった理由を説明します。私の検索、追加、削除操作は正常に機能しています(正しく持続しています)。しかし、UPDATEは機能していないようです。

オブジェクトの状態を手動で設定する必要があるというスレッドをいくつか見つけました。

ctx.ObjectStateManager.ChangeObjectState(person, EntityState.Modified);

あれは正しいですか?このロジックはどこに置きますか?作業単位の操作として公開しますか?

明らかに問題は、純粋なPOCOを使用しているため(EntityObjectの派生、INotifyPropertyChangingの実装がないため)、変更の追跡がまったくないことです。

しかし、私は今までそれに関する問題を見つけていません。

私は何が間違っているのですか?

4

1 に答える 1

2

変更の追跡などがないので、EFSaveChanges()が呼び出されたときにアタッチされたエンティティをどう処理するかを決定する方法があるはずです。デフォルトでは、EntityStateはUnchangedであるため、更新する場合は、手動で状態を設定する必要があります。

もう1つの方法はPerson、このIDを使用してクエリを実行し、コントローラーからフェッチしたデータを使用してプロパティを書き換え、を呼び出すことSaveChanges()です。これは実際にはより安全な方法です。ユーザーがWebフォームを編集しているときにPersonが削除される状況から身を守ることができるからです。しかし、これには明らかにDBへの追加のラウンドトリップが必要であり、これは多くの場合あまり望ましくありません。

いずれにせよ、実際にエンティティをアタッチしてをに変更するリポジトリメソッド(より具体的)がありUpdate()ます。そして、アクションにはまだ比較的クリーンなコードがあります。AttachEntityStateModified

public ActionResult UpdatePerson(Person person)
{
    repository.Update(person);
    unitOfWork.Commit();
}
于 2010-10-26T07:40:36.390 に答える