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

У меня есть родительские и дочерние объекты, которые являются производными от сущностей 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 в этой ситуации, или есть какой-то другой более эффективный метод, который я могу использовать?

1 Ответ

0 голосов
/ 18 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...