2010-02-16 3 views
2

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

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

ответ

0

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

+0

Спасибо за ответ. Я все еще не знаю, как настроить сопоставление из нескольких объектов SqlEntityChild в один DomainChild. Я, конечно, хотел бы сделать то, что вы предлагаете, но похоже, что все примеры, которые я видел, имеют это неявное индивидуальное требование для сопоставления. Вместо этого мне нужно просто изменить определение SqlEntityChild, чтобы * it * выполнял лучшую работу по объединению нескольких записей перед настройкой сопоставления с DomainChild? –

Смежные вопросы