2011-07-03 16 views
3

私は、インスタンス化されたクラスモデルを取得した.NET MVCのプラクティスが、既にポストされたフォームの値から入力されたプロパティを持つコントローラに渡されます。とても便利な。Reload()はEFエンティティを更新していません

[HttpPost] 
public ActionResult DoTask(MyModel model) 

投稿されたフォームデータからIDおよびその他のプロパティが設定されたモデルが到着します。 しかし、モデルを保存して、データベースにのみ存在する追加のプロパティにアクセスしたいとします。私はこの時点でモデルをリロードする必要があります。

これは、idに基づいてモデルからモデルを完全にリロードすると考えられます。しかし、これは私にとっては起こりません。モデルのプロパティはデータベースからロードされません。彼らはまだ空です。 db.Entry(model).Reload();が私のために失敗している理由を私は理解していない

EDIT

。しかし、私はdbcontextを保存してから、モデルを再読み込みした後に処分することを提案し始めています。これは本当ですか?

編集

WHOOPS!私はそれがすべて間違っている。私は今私が変更をコミットするときそれを参照してくださいdb.SaveChanges()私は実際にMVCコントローラによって設定されているプロパティだけでなく、モデル全体を上書きしています。私は間違ったパターンを持つ必要があります。変更されていないプロパティを上書きせずに新しい値を自分のデータベースに適用するにはどうすればいいですか?これは非常に疑問な質問に変わっています。予想通り

結論

ことが判明したとして、リロード()更新を行います。私の問題は、コントローラコンテキストで自動インスタンス化され、コントローラメソッドにパラメータとして渡されたモデルを使用して、dbcontextにSaveChangesを呼び出すときに、db行を上書きしていたことでした。その場合、割り当てられたプロパティと割り当てられていないプロパティの両方を上書きします。

私は今選択

model = db.Models.Single(x => x.ID == modelID); 

をやっているし、その後のUpdateModel(それを動作させるために接頭辞を呼び出す)

UpdateModel(model, "myPrefix"); 
db.SaveChanges(); 
+0

[Entity Framework:Ignore Columns]の複製が可能です(http://stackoverflow.com/questions/737520/entity-framework-ignore-columns) – bzlm

答えて

0

を使用して、それをあなたが唯一の選択したプロパティを更新する必要がある場合は、あなたがしなければならない更新します手動で行う:

db.YourEntitySet.Attach(model); 
db.Entry(model).Property(m => m.SomeProperty).IsModifed = true; 
// other properties here 
db.SaveChanges(); 

この後、リロードは機能しますが、 1「再読み込み」として

var dbModel = db.YourEntitySet.Single(m => m.Id == model.Id); 
dbModel.SomeProperty = model.SomeProperty; 
// other properties here 
db.SaveChanges(); 

そして、あなたdbModel:とにかくあなたは、単にこれを行うことができモデルをaload。 UpdateModelのような自動化アプローチを使用したり、現在の値を適用することはできません。これは、クライアントによって設定されなかった値を含むすべての値が常に上書きされるためです。

+0

ありがとうございます。それは役に立ちます。私はUpdateModelを使用して、変更されたプロパティ(フォームの投稿で送信されたもの)のみを選択的に更新することができます。UpdateModelを呼び出すと、更新されたプロパティだけがIsModifiedプロパティがtrueに設定されていることがわかります。 – Paul

関連する問題