2009-10-15 6 views
3

Je suis en train de mettre à jour ou de créer une entité qui a une relation enfant, disons que la racine agrégée est Product (ProductId, Title) avec zéro ou plusieurs ProductSuppliers (ProductSupplierId, SuppliedAtPrice, SupplierInfoId) et le DTO représente une structure similaire (toutes les infos). Assez simple.Automapper - Entités imbriquées

J'ai créé une carte simple pour ProductDTO et ProductSupplierDTO et cela fonctionne comme prévu pour de nouvelles entités.

Cependant lors du traitement du DTO, je pourrais être mettre à jour une entité existante, donc je fais quelque chose comme ceci:

Product product = productService.GetViaProductId(productDTO.ProductId) ?? new Product(); 
productDTOMapper.Map(productDTO, product); 
productService.Update(product); 

Pour les types primitifs existants sur le produit, l'amende, tout ORM reconnaîtra si les valeurs sont sale ou pas. Cependant, je ne veux pas que Automapper remplace simplement Product.Suppliers par le nouvel ensemble, je veux brancher quelque part une logique pour itérer sur product.Suppliers et vérifier si une entité existe déjà et la mettre à jour, ou en créer une nouvelle, ProductSupplier n'est pas un objet de valeur, il a un ID, ProductSupplierId.

Je ne trouve pas où brancher ceci dans le mappage.

Des suggestions?

+0

Pour fermer, je me suis déplacé loin d'utiliser AutoMapper à faire VM -> Domaine comme non approprié ou recommandé . En fait, il n'y avait pas beaucoup de travail à faire en premier lieu, donc je vais vivre avec un peu de cartographie de la propriété, je ne vais pas la route de réflexion non plus. –

Répondre

4

Si vous souhaitez revenir en arrière, l'option UseDestinationValue() permet à AutoMapper de ne pas remplacer les valeurs de propriété de destination.

.ForMember (DTO => dto.SomeCollection, opt => opt.UseDestinationValue())