Модифицированный объект сущности сохраняется в базе данных, но получение с помощью .net не отражает изменений - PullRequest
1 голос
/ 12 ноября 2011

Я использую объект сущности под названием Пользователь.Это функция, которую я использую для сохранения (в хранилище):

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);
}

Я упустил некоторые коды исключения и проверки ошибок для краткости.

Ответы [ 2 ]

1 голос
/ 12 ноября 2011

_db в GetUsers, вероятно, является экземпляром ObjectContext? Когда ты это делаешь?

Поведение, которое вы описываете, может быть объяснено, если вы сохраняете один и тот же экземпляр между запросами. В этом случае он возвращает объекты User, которые уже были получены до того, как вы обновили значения в базе данных. Обновление их должно помочь:

_db.Refresh(RefreshMode.StoreWins, user);

Хотя лучшей практикой будет создание нового экземпляра ObjectContext для каждого запроса.

1 голос
/ 12 ноября 2011
[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);        
}

причина в том, что вы передаете ту же старую модель представлению, см.

[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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...