2010-07-27 3 views
1

J'utilise AutoMapper pour mapper un objet Linq Domain et un ViewModel afin d'afficher un formulaire Edit pour l'utilisateur qui fonctionne parfaitement. Quand ils cliquent sur submit, je voudrais savoir quelle est la meilleure façon de mapper le ViewModel à une entité Linq et de le conserver dans la base de données.ASP.NET MVC2 Publication d'un mappage ViewModel vers Domain (LINQ) pour l'envoi de modifications

L'entité Linq que j'utilise possède plusieurs collections d'autres entités (c'est-à-dire des références un-à-plusieurs).

Je tentais:

  1. construire mon modèle de vue personnalisé à l'aide UpdateModel
  2. obtenir l'état précédent de l'entité LINQ en utilisant le passé dans id
  3. carte du modèle de vue sur la entité LINQ (à l'aide de automapper)
  4. appel SubmitChanges() le contexte des données

Cette méthode fonctionne lorsque je ne fais que mettre à jour des propriétés qui ne sont pas des collections, mais qui génère des erreurs lors de la tentative de modification de propriétés qui sont des collections.

Toute aide/pensées serait très apprécié :)

Répondre

1

J'ai pris une approche qui est très similaire à celui utilisé par Jimmy Bogard dans le projet CodeCampServer (http://codecampserver.codeplex.com/)

J'ai une Mapper générale class dont j'hérite d'où j'ai juste besoin de surcharger une méthode MapToModel qui mappe du modèle ViewModel au domaine, et une méthode GetIdFromViewModel qui renvoie l'id approprié au ViewModel afin que la couche Service puisse récupérer le modèle de domaine de la base de données.

J'ai dû changer un peu des exemples de CodeCampServer parce que certains de mes modèles utilisaient Guid et certains utilisaient int comme ID pour le modèle.

Vous devriez être en mesure d'attraper le code à partir du lien du codeplex ci-dessus et cela devrait vous aider à aller dans cette direction.

Voici ce qu'un de mes cartographes pour un Membre ressemble:

public class MemberMapper : AutoFormMapper<Member, MemberFormViewModel, Guid>, IMemberMapper 
{ 
    public MemberMapper(IMemberService service) : base(service) { } 

    protected override Guid GetIdFromViewModel(MemberFormViewModel viewModel) 
    { 
     return viewModel.MemberId; 
    } 

    protected override void MapToModel(MemberFormViewModel viewModel, Member model) 
    { 
     // if the need arises, we will need to map the full objects as Foreign Key properties 
     // by using the proper repositories 
     // right now for loading the object to save back to the DB we don't have that need, so let's not waste the call 

     model.MemberId = viewModel.MemberId; 
     model.FirstName = viewModel.FirstName; 
     model.LastName = viewModel.LastName; 
     model.Title = viewModel.Title; 
     model.EmailAddress = viewModel.EmailAddress; 
     model.DirectPhone = viewModel.DirectPhone; 
     model.MobilePhone = viewModel.MobilePhone; 
     model.ElectronicId = viewModel.ElectronicId; 
     model.ProjectRoleTypeId = viewModel.ProjectRoleTypeId; 
     model.DepartmentId = viewModel.DepartmentId; 
    } 
} 

Ensuite, vous pouvez utiliser cette carte MemberMapper pour les deux directions. Il utilise AutoMapper pour passer du modèle de domaine au modèle de vue, puis utilise la méthode MapToModel que vous implémentez pour mapper du modèle de vue au modèle de domaine.

+0

Merci, j'ai regardé de plus près à http://codecampserver.codeplex.com/ il y a beaucoup à apprendre de là-bas. Je suis allé avec quelque chose de similaire à ce que vous avez suggéré, merci de m'indiquer dans la bonne direction. – Chris

Questions connexes