Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using AutoMapper in the Edit action method in an MVC3 application

Here is my controller code, which works 100% as I need it to. However the POST method isn't using the AutoMapper and that is not OK. How can I use AutoMapper in this action method?

I'm using Entity Framework 4 with the Repository Pattern to access data.

public ActionResult Edit(int id)
{
    Product product = _productRepository.FindProduct(id);
    var model = Mapper.Map<Product, ProductModel>(product);
    return View(model);
}

[HttpPost]
public ActionResult Edit(ProductModel model)
{
    if (ModelState.IsValid)
    {
        Product product = _productRepository.FindProduct(model.ProductId);

        product.Name = model.Name;
        product.Description = model.Description;
        product.UnitPrice = model.UnitPrice;

        _productRepository.SaveChanges();

        return RedirectToAction("Index");
    }

    return View(model);
}

If I use AutoMapper, the entity framework reference is lost and the data doesn't persist to the database.

[HttpPost]
public ActionResult Edit(ProductModel model)
{
    if (ModelState.IsValid)
    {
        Product product = _productRepository.FindProduct(model.ProductId);
        product = Mapper.Map<ProductModel, Product>(model);

        _productRepository.SaveChanges();

        return RedirectToAction("Index");
    }

    return View(model);
}

I'm guessing this is caused the Mapper.Map function returning a brand new Product object and because of that, no references to the entity framework graph is being kept. What alternatives do you suggest?

like image 571
Only Bolivian Here Avatar asked Jan 13 '12 00:01

Only Bolivian Here


1 Answers

I think you just do

 Product product = _productRepository.FindProduct(model.ProductId);
 Mapper.Map(model, product);
 _productRepository.SaveChanges();

you may also want to check that you have a non null product first, and also that user is allowed to change that product....

like image 143
Keith Nicholas Avatar answered Oct 25 '22 19:10

Keith Nicholas