Как я могу сопоставить эти родительско-дочерние отношения в AutoMapper?

У меня есть родительские и дочерние объекты, производные от сущностей LINQ to SQL. Я хочу сопоставить их с некоторыми DTO, более удобными для домена. Мои классы сущностей SQL выглядят примерно так:

public class SqlEntityParent
{
    public int ParentId { get; set; }
    public string Name { get; set; }
    public EntitySet<SqlEntityChild> Children { get; set; }
}

public class SqlEntityChild
{
    public int ChildId { get; set; }
    public int ParentId { get; set; }
    public int Position { get; set; }
    public string CategoryName { get; set; }
    public string CategoryValue { get; set; }
}

В этой модели это стандартное отношение «один ко многим» между SqlEntityParent и SqlEntityChild. Некоторые репрезентативные данные были бы ...

Родитель:

 ParentId   Name
 --------   -------
 1          Parent1

Ребенок:

ChildId  ParentId   Position   CategoryName   CategoryValue
-------  --------   --------   ------------   -------------
1        1          1          Contents       Things
2        1          1          Group          GroupOne
3        1          2          Contents       Things
4        1          2          Group          GroupTwo

Теперь я хочу сопоставить эти данные с объектами моего домена, которые выглядят примерно так:

public class DomainParent
{
    public int ParentId { get; set; }
    public string Name { get; set; }
    public List<DomainChild> Children { get; set; }
}

public class DomainChild
{
    public int Position { get; set; }
    public string Contents { get; set; }
    public string Group { get; set; }
}

В этой структуре один объект DomainChild состоит из данных двух объектов SqlEntityChild, а группировка определяется значением Position дочерней сущности. Итак, эти образцы данных представляют собой один объект DomainParent со списком из двух объектов DomainChild. Первый дочерний элемент должен иметь Position 1, Contents значение «Вещи» и Group значение «GroupOne». У второго дочернего элемента должно быть Position 2, Contents «Вещи» и Group «GroupTwo».

Мне удобно настраивать индивидуальное сопоставление в AutoMapper с помощью ValueResolvers, но я не уверен, как лучше с этим справиться. Я создал приведенный ниже преобразователь и соответствующее сопоставление для родительских сущностей, которое отображает весь список дочерних сущностей за один проход, но это кажется глупым, потому что мне приходится выполнять все сопоставление дочерних объектов вручную в этом классе преобразователя.

Mapper.CreateMap<SqlEntityParent, DomainParent>()
    .ForMember(dto => dto.Children, opt => opt.ResolveUsing<MyResolver>());


public class MyResolver: ValueResolver<SqlEntityParent, List<DomainChild>>
{
    private MyDataContext db;

    public MyResolver()
    {
        db = new MyDataContext();
    }

    protected override List<DomainChild> ResolveCore(SqlEntityParent source)
    {
        // In here:
        //   1. custom LINQ queries
        //   2. manual creation of DomainChild objects
        //   3. manual mapping of SqlEntityChild to DomainChild
    }
}

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


person Chris Farmer    schedule 16.02.2010    source источник


Ответы (1)


Обычно в этих случаях мы сопоставляем SqlEntityChild прямо с DomainChild, так как автоматически поддерживаются списки, массивы и тому подобное. Вам просто нужно настроить сопоставления для типов элементов, учитывая, что нет никакой дополнительной логики, кроме итерации по исходной коллекции Children.

person Jimmy Bogard    schedule 18.02.2010
comment
Спасибо за ответ. Я до сих пор не очень понимаю, как настроить отображение нескольких объектов SqlEntityChild в один DomainChild. Я, конечно, хотел бы иметь возможность делать то, что вы предлагаете, но похоже, что все примеры, которые я видел, имеют это неявное однозначное требование для сопоставления. Должен ли я вместо этого просто изменить определение SqlEntityChild, чтобы it выполнял лучшую работу по агрегированию нескольких записей перед настройкой сопоставления с DomainChild? - person Chris Farmer; 18.02.2010