У меня есть родительский и дочерний объекты, которые производны от объектов 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 в этой ситуации, или есть какой-то другой более эффективный метод, который я могу использовать?
Спасибо за ответ. Я все еще не знаю, как настроить сопоставление из нескольких объектов SqlEntityChild в один DomainChild. Я, конечно, хотел бы сделать то, что вы предлагаете, но похоже, что все примеры, которые я видел, имеют это неявное индивидуальное требование для сопоставления. Вместо этого мне нужно просто изменить определение SqlEntityChild, чтобы * it * выполнял лучшую работу по объединению нескольких записей перед настройкой сопоставления с DomainChild? –