2011-11-11 7 views
1

私はUserというエンティティオブジェクトを使用しています。エンティティオブジェクトを変更するとデータベースに保存されますが、.netで取得すると変更が反映されません

public void saveUser(User user){ 
if (user.EntityState == System.Data.EntityState.Detached) 
    this._db.Users.Attach(user); // attach to the context 

this._db.ObjectStateManager.ChangeObjectState(user, System.Data.EntityState.Modified); 
this._db.SaveChanges(); 
} 

このエンティティは、エンティティデータモデルデザイナーで作成されました:これは私が(リポジトリ内)を保存するために使用する機能です。これはビュー(私はモデルとしてエンティティオブジェクトを使用しています)によって変更され、セーブコールは私のコントローラによって行われます。

ユーザーを編集すると、変更内容はデータベースに保存されますが、ビューには古いプロパティが表示されます。プログラムを再起動すると、正しいプロパティ値が表示されます。これは私がリポジトリからオブジェクトを取得しています方法です

public IQueryable<User> GetUsers(String user_name) 
    { 
     IQueryable<User> userquery = from u in _db.Users 
            where u.user_name == user_name 
              select u ; 

     return userquery; 

    } 

コントローラ:私は簡潔にするため、例外とエラーチェックコードの一部を残し

public ActionResult ManageUser(String user_name) 
    { 
      IQueryable<User> users = this.users_db.getUsers(user_name); 
      User user = users.First(); 
      return View(user); 

    } 
[HttpPost] 
public ActionResult ManageUser(User user){ 
    this.users_db.saveUser(model.user); 
    ViewBag.message="Success"; 
    return View(user); 
} 

+0

コントローラの外観はどうですか? –

+0

コントローラー機能を追加しました。ありがとう。 – James

答えて

1

_dbを参照してください更新されたモデルを照会することができますが、おそらくインスタンスでありますObjectContextの?いつインスタンス化していますか?

要求間で同じインスタンスを保持している場合は、記述する動作を説明できます。この場合、データベース内の値を更新する前にすでに取得されたUserオブジェクトが返されます。それらをリフレッシュすると、次のように役立ちます。

_db.Refresh(RefreshMode.StoreWins, user); 

各要求に対して新しいObjectContextインスタンスを作成することをお勧めします。

+0

ありがとう!私は、各要求に対して新しいコンテキストを作成することを選択し、うまくいきました。 – James

1
[HttpPost] 
public ActionResult ManageUser(User user){ 
    this.users_db.saveUser(model.user); 
    ViewBag.message="Success"; 
    return RedirectToAction("ManageUser"); 
} 

またはあなたが再び

[HttpPost] 
public ActionResult ManageUser(User user){ 
    this.users_db.saveUser(model.user); 
    ViewBag.message="Success"; 
    IQueryable<User> users = this.users_db.getUsers(user_name); 
    user = users.First(); 
    return View(user);   
} 

ビューに同じ古いモデルを渡しているある理由はGetUsersで

[HttpPost] 
public ActionResult ManageUser(User user){ <-- you get the posted model here 
    this.users_db.saveUser(model.user);<-- here it is saved 
    ViewBag.message="Success"; <--success msg 
    return View(user);<-- and here you are passing the recieved model as it is to the view 
} 
+0

この変更を加えても問題は残っていました。ページから離れて戻ったときに古い値が表示されるためです。 – James