Использование AutoMapper для помощи в переборе объектов - PullRequest
0 голосов
/ 25 июня 2018

У меня возникли некоторые проблемы с отображением, которые, как я надеялся, может помочь сообществу.Я работаю с AutoMapper версии 6.0 для установления связей между объектами.У меня есть три объекта (названных в общих чертах, поскольку сами данные на самом деле не имеют значения) со следующей структурой:

public ObjectA {
    string field1 { get; set; }
    string field2 { get; set; }
    string field3 { get; set; }
    string field4 { get; set; }
}

public ObjectB {
    string field1 { get; set; }
    string field2 { get; set; }
    List<ObjectC> ObjectC { get; set; }
}

public ObjectC {
    string field3 { get; set; }
    string field4 { get; set; }
}

У меня есть пара настроенных карт, например:

Mapper.Initialize(cfg => {
    cfg.CreateMap<ObjectC, ObjectA>();
    cfg.CreateMap<ObjectB, ObjectA>();
});

Какиеподводит меня к моей проблеме.ObjectA является прямым представлением таблицы БД и ее полей, и я хотел бы использовать ObjectB для создания проверки записей в таблице с использованием ObjectA и добавления любых, которые еще не существуют.Моя проблема в том, что я, похоже, не понимаю, как установить правильное соединение между ObjectB и ObjectA через AutoMapper, в котором я проверяю для каждого возможного варианта, который ObjectB может создать ObjectA.

Конечная цель должна выглядеть примерно так:

ObjectA objectA = // mapped data from ObjectB with the contents of List Item [0]
var objectAExists = _dataHandlers.GetObjectA;
if (objectAExists)
{
   // some code to return use to iterate back that this variant is in the DB already
   log.Info("ObjectA Already Exists");
}
else
{
    var results = storeContents(objectA);
    log.Info("New Contents Stored");
}
// return to top of iteration and this time process with contents using ObjectB.ObjectC[1] being used, and so on.

Я пробовал ряд подходов, таких как:

// try to iterate through each List item...
for (int i = 0; i < ObjectB.ObjectC.Count; i++) {  
    //I wanted this to map the contents like so:
    ObjectA objectA = new ObjectA() {
        Field1 = ObjectB.Field1,
        Field2 = ObjectB.Field2,
        Field3 = ObjectB.ObjectC[i].Field3,
        Field4 = ObjectB.ObjectC[i].Field4
    }
    // but I couldn't figure out how to make a similar association using AutoMapper...
}

// tried to iterate through each with a foreach loop... but was in a similar situation as above... 
foreach (var objectC in ObjectB.ObjectC)  { // some code... }

// I tried double mapping...
    var objectA = Mapper.Map<ObjectA>(ObjectB);
    objectA = Mapper.Map<ObjectA>(objectC); // new problem hits here
// when I attempted to add the data from the new mapping, it overwrote the data populated by the first mapping...
// Change '=' to '+=' wasn't possible, so that didn't help...

// altering the mapper...
   cfg.CreateMap<ObjectB, ObjectA>()
       .Include<ObjectC, ObjectA>();

Даже пытался использовать преобразователи типов ..... но столкнулся с другой стеной.Излишне говорить, что у меня мало идей, и документация AutoMapper, по-видимому, не предоставляет достаточно информации, чтобы помочь решить эту проблему.Буду очень признателен за любые советы, которые могут указать мне на решение ...

Спасибо всем заранее.

1 Ответ

0 голосов
/ 25 июня 2018

Возможно, вы ищете выражение сопоставления, которое указывает, что свойство назначения должно отображаться, только если оно еще не установлено.Таким образом, отображение является условным.Если свойство назначения еще не установлено, оно будет отображено из источника.Если место назначения уже заполнено, оно не будет перезаписано.

Mapper.Initialize(
    cfg =>
    {
        cfg.CreateMap<ObjectB, ObjectA>()
            .ForMember(src => src.field2,
                opt => opt.ResolveUsing((src, dest) => 
                    dest.field2 = dest.field2 ?? src.field2
                ));
    }); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...