J'essaie d'utiliser MOWORAPPER pour mapper certains objets DTO (contrat de données) reçu d'un service Web dans mes objets métier. L'objet DTO racine contient une collection d'objets enfants. Mon objet métier a également une collection d'enfants d'enfants d'enfants. Afin de faire fonctionner SOWORAPPER, je devais inclure un setter sur la propriété de la collection de mon objet métier ou la collection serait toujours vide. De plus, je devais ajouter un constructeur par défaut au type de collecte. Donc, il me semble que MODApper instanciant instanciant d'un nouvel objet de collection, le remplissant et la fixation de la propriété de la collection de mon objet métier.
Bien que tout cela soit bien et bien, j'ai une logique supplémentaire qui doit être câblée quand La collection est créée et le constructeur par défaut défait le but. Essentiellement, je crée la relation parent-enfant et le câblant de certains événements afin qu'ils bouillonnent de l'enfant au parent. P>
Ce que je voudrais faire, c'est que FOWORAPPPER puisse simplement créer des objets enfants de la collection de DTO à la collection existante sur mon bo. En d'autres termes, ignorez la création d'une nouvelle collection et utilisez simplement celui de l'objet de l'entreprise déjà. P>
Y a-t-il un moyen de accomplir facilement cela?!?!? P>
Mise à jour forte> p> Peut-être une meilleure question et une solution plus simple à mon problème, c'est s'il est possible de définir des arguments que MODAPPER passera à la collection lorsqu'il est instancié? Ma collection enfant est définie comme ceci: p> si je peux configurer SOWORAPPER pour utiliser ce constructeur et transmettre l'objet approprié, ce serait parfait! P> Par souci de clarté, voici les autres classes de l'espace problématique: p> i configure Automapper de cette façon: P> Mapper.CreateMap<ParentDTO, ParentObject>()
.ForMember(obj => obj.Children, opt.MapFrom(dto => dto.Children))
.ConstructUsing(col => new ChildCollection(obj));
3 Réponses :
Si j'ai compris votre problème, vous devriez pouvoir utiliser constructif code> comme indiqué dans cette réponse:
Mapper - Comment planer des paramètres du constructeur au lieu de Setteurs de propriétés P>
Cela fonctionnerait si je n'avais pas besoin de transmettre une référence à l'objet parent au constructeur. CONSTRUCTION Permet de définir comment mapper EnfricanCollection elle-même, mais ne me permet pas de dire à Coorapper comment construire la collection lorsqu'elle est trouvée comme une propriété de mon objet parent.
Il s'avère que la réponse était juste là tout. L'option d'utiliseStinationValue fait exactement ce que je veux.
Cette option indique à SOWORAPPER d'utiliser la propriété existante sur l'objet cible et de la cartographe des propriétés de l'enfant ou des éléments de collecte dans cet objet plutôt que de créer un nouvel objet proxy. P>
Donc, voici tout ce que je dois faire dans ma candidature: p> et, voici! Maintenant, je peux instancier la collection enfant, avec référence parent et configurer la référence au parent dans chaque élément, car il est ajouté à la collection. P> P>
Cela vous dérangerait-il de poster votre exemple de code final ?? J'ai du mal à comprendre avec quoi vous avez fini exactement
J'aimerais pouvoir vous donner +100. J'ai commencé à jouer avec Comtableapper et j'ai passé environ 2 heures à essayer de comprendre celui-ci jusqu'à ce que je voyais votre réponse!
STI est possible pour EntityFramework (MVC ou CORE) avec AutomApper.Collection.entityFrameworkCore ou EntityFramework en correspondant aux identifiants enfants aux identifiants d'objet de destination comme ci-dessous
public int AddMany(List<OrderDto> orderDtos) { try { List<Order> orders = new List<Order>(); foreach (var oi in orderDtos) { var oneOrder = _mapper.Map<OrderDto, Order>(oi); oneOrder.OrderDetails = new List<OrderDetail>(); foreach (var oid in oi.OrderDetails) { var oneOrderItem = _mapper.Map<OrderDetailDto, OrderDetail>(oid); oneOrder.OrderDetails.Add(oneOrderItem); } orders.Add(oneOrder); } _orderRepository.InsertMany(orders); return _uow.SaveChangesAsync().Result; } catch (Exception ex) { return 0; } }