Действие «Редактировать сообщение» - почему respository.save () сохраняет данные? - PullRequest
1 голос
/ 20 июня 2010

Я немного растерялся.Я не могу объяснить, почему работает следующее:

    AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection formValues) {
       Dinner dinner = dinnerRepository.GetDinner(id);
       UpdateModel(dinner);
       dinnerRepository.Save();
       return RedirectToAction("Details", new { id = dinner.DinnerID });
    }

Образец взят из пошагового руководства Скотта Гатри NerdDinner, где dinnerRepository.Save () определено как:

public void Save() {
   db.SubmitChanges();
}

И ужинRepository.GetDinner (id) определяется следующим образом:

public Dinner GetDinner(int id) {
   return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
}

Т.е. как БД NerdDinnerDataContext "знает", как сохранить объект обеда?

В моем понимании должна быть дыраLinq To SQL, но взорван, если я могу указать это.Итак, у объекта ужин есть идентификатор, но что говорит БД, что есть изменения, которые нужно отправить для этой конкретной записи с этим идентификатором?

Я просто не вижу его.Должно быть, Кубок мира ...

Я могу только думать, что объект DataContext, db, сохраняет ссылку на объект ужин, который был получен с помощью вызова метода GetDinner.Но ... Все это кажется немного "волшебным"

Андрей

Ответы [ 2 ]

0 голосов
/ 20 июня 2010

Вы должны посмотреть на сгенерированный код для классов LINQ to SQL. Вы увидите, что установщики и получатели свойств для классов содержат отслеживание изменений, поэтому при следующем сохранении репозитория генерируются правильные операторы SQL для фиксации любых мутаций в объектах.

0 голосов
/ 20 июня 2010

Как вы подозреваете, он обрабатывается уровнем ORM (который является либо Linq2SQL, либо структурой сущностей ... не помню, какой именно).Уровни ORM нередко отслеживают изменения в объектах, которыми они управляют, и поскольку измененный объект был извлечен из уровня ORM (посредством вызова db.Dinners.SingleOrDefault() ORM отслеживает изменения этого объекта, поэтому он знаетчто это изменилось, когда вы звоните SubmitChanges. Это все часть магии ORM.

...