2011-03-30 4 views
2

J'utilise Subsonic 3 et Automapper sur un projet asp.net MVC3.Subsonic et Automapper - la collection dirtyColumns est vide donc ne peut pas mettre à jour

Dans mon HttpPost ActionResult, je prends mon modèle et le mappage à mon entité générée Subsonic.

Le mappage ne fonctionne pas de problèmes, mais je ne peux pas mettre à jour l'entité. Après une inspection plus approfondie, c'est parce que je n'ai pas de colonnes sales, donc mon appel à Update() échoue car Subsonic ne pense pas qu'il doive mettre à jour quoi que ce soit.

J'ai remis en jigged les charges de code - même en forçant la méthode à charger à nouveau l'entité à partir de la base de données avant le mappage avec le modèle. Il semble juste que le mapping détruise le tracking dirtyColumns. Par exemple. Si je mappe après le chargement à partir de la base de données, puis modifie une propriété aléatoire, il n'est pas marqué comme une colonne sale.

J'ai également essayé d'utiliser l'appel de méthode SetIsLoaded (true). Pas de joie après la cartographie.

Voici ma méthode:

[HttpPost] 
    public virtual ActionResult Edit(SinglePersonModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      Data.Person person; 

      //Now Map my model to my entity - this works 
      Mapper.CreateMap<SinglePersonModel, Data.Person>(); 
      person = Mapper.Map<SinglePersonModel, Data.Person>(model); 

      //THIS DOESN'T SET MY COLUMN TO DIRTY 
      person.Link = "asdjsadij"; 

      //THIS DOESN'T SET MY COLUMN TO DIRTY EITHER 
      person.SetIsLoaded(true); 
      person.Link = "asdjsadij"; 

      if (person.PersonId > 0) 
       PersonRepository.UpdatePerson(person); 
      else 
       PersonRepository.CreatePerson(person); 

      return RedirectToAction(MVC.SecureAdministration.Person.Index()); 
     } 
     else return View(model); 
    } 

Les méthodes statiques sur mon PersonRepository il suffit d'appeler la mise à jour de subsonique() et Save() respectivement.

Toutes les idées seraient grandement appréciées. Je pense maintenant que je pourrais avoir besoin de mettre des propriétés supplémentaires dans mon modèle pour m'assurer qu'elles sont transportées dans l'entité par l'automapper.

Dans le pire des cas, je ne devrais pas utiliser l'Automapper lors du mappage vers des entités du modèle, ce qui serait nul.

+0

Je ne suis pas entièrement sûr (je ne l'ai pas utilisé subsonique) mais je pense que si vous ** ** charge l'entité personne de l'emplacement source d'abord, puis il sera marqué comme sale lorsque vous le mettez à jour en utilisant automapper. – Buildstarted

+0

Oui et non. Si je charge à nouveau l'entité et que je mets à jour une propriété, elle sera marquée comme sale. (Je voudrais éviter de charger à nouveau l'entité de la base de données). Cependant, si je charge à nouveau l'entité et que je la mappe, rien ne sera marqué comme sale. Il semble que l'automapper soit juste un peu trop brutal ici dans ce qu'il écrase sur l'objet de destination. Je peux obtenir des colonnes sales sans recharger de la source de toute façon - j'ai juste besoin d'appeler person.SetIsLoaded (true). Encore une fois, cela fonctionne lors de la mise à jour d'une propriété, mais pas lors de la mise en correspondance avec elle. –

+0

'AutoMapper.Mapper.Map (modèle, personne);' - L'avez-vous essayé comme ça? Cela n'assigne pas une nouvelle instance de l'objet mais l'affecte à l'objet existant. Juste une pensée. Je comprends le besoin de ne pas le charger depuis le db. Mais pensé que cela pourrait aider un peu :) – Buildstarted

Répondre

1

AutoMapper.Mapper.Map<SinglePersonModel, Data.Person>(model, person); - L'avez-vous essayé comme ceci? Cela n'assigne pas une nouvelle instance de l'objet mais l'affecte à l'objet existant. Juste une pensée. Je comprends le besoin de ne pas le charger depuis le db. Mais pensé que cela pourrait aider un peu :)

Merci pour cela - heureux de vous aider :)

Questions connexes