Как сохранить Edit в MVC3? - PullRequest
0 голосов
/ 24 августа 2011
public ActionResult Edit(int id)
{
    var productBrand = brandRepo.FindProductBrand(id);
    ProductBrandModel model = Mapper.Map<ProductBrand, ProductBrandModel>(productBrand);
    return View(model);
}

[HttpPost]
public ActionResult Edit(ProductBrandModel model)
{
    if (ModelState.IsValid)
    {
        var productBrand = brandRepo.FindProductBrand(model.BrandId);
        productBrand.Name = model.Name;               
        //How to persist that information?
    }
}

У меня есть EF-класс ProductBrand и модель для представлений, называемая ProductBrandModel.

Как мне сохранить информацию о редактировании с использованием Entity Framework?Если бы у моего brandRepo был метод void, называемый SaveChanges, куда я бы отправил:

public void SaveChanges()
{
    dbEntities.SaveChanges();
}

Ответы [ 2 ]

1 голос
/ 24 августа 2011

Как вы правильно предполагаете, вы должны зафиксировать свои изменения в базе данных, используя метод .SaveChanges().В вашем случае brandRepo.SaveChanges() будет делегироваться dbEntities.SaveChanges().

. Примечание: в простых случаях отдельный класс репозитория только вносит сложность, но не дает никаких преимуществ.DbContext Entity Framework в значительной степени напоминает сам простой репозиторий, поэтому вам не нужен один сверху.

Конечно, для удобства тестирования слой косвенности может иметь смысл.

Без хранилища ваш код может выглядеть примерно так:

public ActionResult Edit(int id)
{
    var productBrand = dbEntities.ProductBrands.Find(x => x.BrandId = id);
    ProductBrandModel model = Mapper.Map<ProductBrand, ProductBrandModel>(productBrand);
    return View(model);
}

[HttpPost]
public ActionResult Edit(ProductBrandModel model)
{
    if (ModelState.IsValid)
    {
        var productBrand = dbEntities.ProductBrands.Find(x => x.BrandId = id);
        // or something similar, I don't know the inner workings of your
        // brandRepo.FindProductBrand(id)

        productBrand.Name = model.Name;               
        dbEntities.SaveChanges();
    }
}
0 голосов
/ 24 августа 2011

Мне нравится иметь метод save в моем репозитории в сочетании с вспомогательным методом, который я получил из сети. SaveCustomer - это мой метод класса репозитория, а под ним - вспомогательный класс. В вашем случае вы передадите свою модель в

brandRepository.SaveProdctBrand(productBrand)

(помогает разобрать имена для правил именования и правил fxcop)

public void SaveCustomer(Customer customer)
{
  using (var ctx = new WebStoreEntities())
  {
    if (customer.CustomerId > 0)
    {
        //It's an existing record, update it.
        ctx.Customers.AttachAsModified(customer);
        ctx.SaveChanges();
    }
    else
    {
        //its a new record.
        ctx.Customers.AddObject(customer);
        ctx.SaveChanges();
    }
  }
}

Вспомогательный класс выглядит следующим образом

public static class EntityFrameworkExtensions
{
/// <summary>
/// This class allows you to attach an entity.
/// For instance, a controller method Edit(Customer customer)
/// using ctx.AttachAsModified(customer); 
/// ctx.SaveChanges();
/// allows you to easily reattach this item for udpating.
/// Credit goes to: http://geekswithblogs.net/michelotti/archive/2009/11/27/attaching-modified-entities-in-ef-4.aspx
/// </summary>
public static void AttachAsModified<T>(this ObjectSet<T> objectSet, T entity) where T : class
{
    objectSet.Attach(entity);
    objectSet.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}

/// <summary>
/// This marks an item for deletion, but does not currently mark child objects (relationships).
/// For those cases you must query the object, include the relationships, and then delete.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="objectSet"></param>
/// <param name="entity"></param>
public static void AttachAsDeleted<T>(this ObjectSet<T> objectSet, T entity) where T : class
{
    objectSet.Attach(entity);
    objectSet.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Deleted);
}

public static void AttachAllAsModified<T>(this ObjectSet<T> objectSet, IEnumerable<T> entities) where T : class
{
    foreach (var item in entities)
    {
        objectSet.Attach(item);
        objectSet.Context.ObjectStateManager.ChangeObjectState(item, EntityState.Modified);
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...