Как сохранить изменения с MVC 2 en EF 4? - PullRequest
1 голос
/ 02 мая 2011

Я использую MVC 2 с EF4. Создание или удаление объектов работает, а обновление - нет. Я прочитал много и много уроков / вопросов по StackOverflow, но я не нашел реального РАБОЧЕГО кода, который можно было бы использовать в моем методе «Правка».

    [HttpPost]
    public ActionResult Edit(int id, Account model)
    {
        try
        {
            Account accountEdited = accountRepository.Get(id);

            // Working code to update "accountEdited" with "model"'s values ???

            accountRepository.Save();

            return RedirectToAction("Details", new { id = id });
        }
        catch (Exception ex)
        {
            return View();
        }
    }

Я использую EntityFramework со службой данных WCF

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

Это то, что я делаю:

[HttpPost]
public ActionResult Edit(int id, Account model)
{
    try
    {
        Account accountEdited = accountRepository.Get(id);
        TryUpdateModel(accountEdited);
        ctx.SaveChanges();
        return RedirectToAction("Details", new { id = id });
    }
    catch (Exception ex)
    {
        return View();
    }
}

Первоначальный вызов хранилища гарантирует, что объект находится на графике в состоянии Неизменено .Встроенный в MVC метод TryUpdateModel затем объединит два объекта (объект accountEdited и данные публикации формы, привязанные к модели).

Это приведет к тому, что объект будет в Modified state.

Простой вызов SaveChanges() для контекста объекта затем подтолкнет изменения в базу данных.

Я пробовал такие методы, как "метод заглушки", но он представил мирболи (в основном это связано с отношениями), так что это самый простой подход, который хорошо работает.

HTH

1 голос
/ 02 мая 2011

У вас есть реальная работа с EF, абстрагированная от кода, который вы опубликовали.Вот простейшее сохранение EF:

public void Save(Account account)
{
    using (DBContext ctx= new DBContext ())
    {
        ctx.Attach(account);
        ctx.SaveChanges();
    }
}

Вам нужно прикрепить объект, только если он был получен в другом контексте.Если нет, вы можете сделать это как:

public void Save(int AccountID)
{
    using (DBContext ctx= new DBContext ())
    {
        Account account = ctx.Account.Single(a => a.ID == AccountID)
        account.property = somepropchange;
        ctx.SaveChanges();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...