Обновление LinqToSql MVC3 - PullRequest
       5

Обновление LinqToSql MVC3

0 голосов
/ 18 апреля 2011

Я использую ASP.NET MVC3 и в качестве слоя данных LinqToSql. Я немного запутался, как я могу отредактировать сущность.

public ActionResult Edit(int id)
{
    var product = _repository.GetById(id);
    return View(product);
}


[HttpPost]
public ActionResult Edit(Product product)
{
    if (ModelState.IsValid)
    {
        _repository.EditProduct(product);
        return RedirectToAction("Index");
    }
    return View();
}

Переменная product в Edit () в порядке, но после редактирования просмотрите переменную, переданную в [HttpPost] Edit имеет нулевое значение в свойствах ссылки и, кажется, отделен от моего DataContext. А также, какой код я должен выполнить в методе EditProduct, чтобы обновить сущность?

Спасибо.

Ответы [ 3 ]

1 голос
/ 18 апреля 2011
public void EditProduct(Product product) {
    using (var context = new MyContext()) {
        var dbProduct = context.Product.Single(r => r.Id == product.Id);
        dbProduct.Property = product.Property;
        dbProduct.ProductCategory = context.ProductCategory.Single(r => r.Id == product.ProductCategoryId);
        context.SubmitChanges();
    }
}
  1. Ваш метод Edit (Product product) создаст экземпляр Product из параметров HTTP-запроса.Он делает это, используя отражение и просматривая свойства класса Product, чтобы увидеть, что соответствует HTTP-запросу.Это называется привязкой к модели, и вы можете изучить ее подробнее, чтобы узнать, как она работает.Причина, по которой ваш экземпляр продукта не имеет ссылок и отделен от вашего контекста, заключается в том, что он был создан как новый простой объект.
  2. Ваш код EditProduct может быть примерно таким же, как указано выше.1007 * (читателю оставлено упражнение, чтобы приведенный выше код обрабатывал исключения, проверку и т. Д.)
1 голос
/ 18 апреля 2011

Я предполагаю, что в вашем хранилище у вас есть объект для вашего контекста данных.При вызове EditProduct у вас должно быть что-то вроде:

Product prod = dataContext.Products.Single(p=>p.ProductID == product.ProductID);

prod.PropertyA = product.PropertyA;
prod.PropertyB = product.PropertyB;
dataContext.SubmitChanges();

Вы также можете прикрепить входящий продукт и сохранить его (если у вас есть столбец отметки времени):

dataContext.Products.Attach(product,true);
dataContext.SubmitChanges();

Если вы ненет столбца метки времени, тогда L2S выдаст ошибку о невозможности проверить его состояние.

Сущность может быть присоединена как измененная без исходного состояния, только если она объявляет член версии или нетиметь политику проверки обновлений.

Если вы добавите столбец отметки времени в свою БД, то L2S может выполнить вышеупомянутое.

Вот более глубокое объяснение.

0 голосов
/ 19 апреля 2011

Я нашел метод, который наилучшим образом соответствует моим потребностям

public ActionResult Edit(int id)
{
    ViewBag.Categories = _repository.GetAllCategories();
    var product = _repository.GetById(id);
    return View(product);
}


[HttpPost]
public ActionResult Edit(int id, FormCollection collection) {
    var product = _repository.GetById(id);
    if (TryUpdateModel(product)) {
        _repository.Commit();
        return RedirectToAction("Index");
    }
    ViewBag.Categories = _repository.GetAllCategories();
    return View(product);
}
...