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