7
votes

FABLApper Passez la référence parent lors de la cartographie de l'objet enfant

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> xxx pré>

si je peux configurer SOWORAPPER pour utiliser ce constructeur et transmettre l'objet approprié, ce serait parfait! P>

une autre mise à jour forte> p>

Par souci de clarté, voici les autres classes de l'espace problématique: p> xxx pré>

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


0 commentaires

3 Réponses :


0
votes

Si j'ai compris votre problème, vous devriez pouvoir utiliser constructif comme indiqué dans cette réponse: Mapper - Comment planer des paramètres du constructeur au lieu de Setteurs de propriétés


1 commentaires

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.



8
votes

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.

Donc, voici tout ce que je dois faire dans ma candidature: xxx

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.


2 commentaires

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!



0
votes

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


0 commentaires