2010-06-20 23 views
1

Je suis un peu embrouillé. Je ne peux pas raison pour laquelle les travaux suivants:Éditer l'action Post - pourquoi respository.save() enregistre-t-il les données?

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 }); 
    } 

L'échantillon est prélevé dans la procédure pas à pas NerdDinner de Scott Guthrie, où dinnerRepository.Save() est définie comme:

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

Et dinnerRepository.GetDinner (id) est défini comme suit:

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

Ie, comment le db NerdDinnerDataContext « savoir » pour sauver l'objet dîner?

Il doit y avoir un trou dans ma compréhension de Linq To SQL, mais soufflé si je peux le pointer. OK, donc l'objet dinner a un identifiant, mais qu'est-ce qui indique à db qu'il y a des changements à soumettre pour cet enregistrement spécifique avec cet Id?

Je ne peux pas le voir. Doit être la Coupe du Monde ...

Je ne peux que penser que l'objet DataContext, db, garde une référence à l'objet dîner qui a été obtenu en utilisant l'appel de méthode GetDinner. Mais ... Tout se sent un peu « magique »

Andrew

Répondre

0

Vous devriez regarder le code généré pour les classes LINQ to SQL Vous verrez que les setters de propriétés et les getters pour les classes contiennent des changements suivi de sorte que la prochaine fois que le référentiel est enregistré, les instructions SQL appropriées sont générées pour valider les mutations faites aux objets

0

Comme vous pensez qu'il est manipulé par la couche ORM (qui est soit cadre Linq2SQL ou entité ... ne me souviens pas qui). Il n'est pas rare que les couches ORM suivent les modifications apportées aux objets qu'elles gèrent, et puisque l'objet modifié a été extrait de la couche ORM (via l'appel db.Dinners.SingleOrDefault(), l'ORM suit les modifications de cet objet, donc il sait qu'il a changé lorsque vous appelez SubmitChanges.Cela fait partie de la magie des ORM

+0

Bien, mais comment sait-il quel objet utiliser comme l'enregistrement mis à jour qui a les modifications? , il garde une référence à l'objet qui a été créé. Regardera ces propriétés. De toute évidence, LINQ To SQL fait plus que ce que je pensais. Devra aller au fond de celui-ci. Merci beaucoup à vous deux. On doit obtenir le biscuit, ainsi va récompenser Jacob qui a répondu en premier. – awrigley

+0

Je ne suis pas sûr des détails de la façon dont Linq2Sql fonctionne, et vous pouvez ou non être en mesure de creuser dans le code pour le savoir. Si vous êtes intéressé, NHibernate surveille également quels objets ont été récupérés dans la base de données et lesquels ont été créés, ainsi que tous les changements qui ont été apportés à ces objets (et cela en utilisant des éléments tels que Dynamic Proxies). Il peut vous sembler intéressant d'examiner le code source de NHibernate et de voir quelle est leur approche pour résoudre ce problème particulier. – ckramer

+0

Je l'examine, et oui, une instance de datacontext suit les données qu'elle a récupérées pendant qu'elles sont dans la portée. Ce fut un gros trou dans ma compréhension et je dois le remplir. Juste besoin de comprendre exactement comment les références fonctionnent. – awrigley