I have parent and child objects that are derived from LINQ to SQL entities. I want to map these onto some domain-friendlier DTOs. My SQL entity classes look somewhat like this:
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; }
}
In this model, it's a standard one-to-many relationship between SqlEntityParent
and SqlEntityChild
. Some representative data would be...
Parent:
ParentId Name -------- ------- 1 Parent1
Child:
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
Now I want to map these data into my domain objects, which look somewhat like this:
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; }
}
In this structure, a single DomainChild
object is made up of data from two SqlEntityChild
objects, and the grouping is determined by the Position
value of the child entity. So, these sample data represent a single DomainParent
object with a list of two DomainChild
objects. The first child should have a Position
of 1, a Contents
value of "Things", and a Group
value of "GroupOne". The second child should have a Position
of 2, a Contents
of "Things", and a Group
of "GroupTwo".
I am comfortable with getting one-to-one custom mapping set up in AutoMapper using ValueResolvers, but I am not sure how best to handle this. I created the below resolver and associated mapping for the parent entities which maps the whole list of child entities in one pass, but it seems goofy because I have to do the whole mapping of child objects manually in this resolver class.
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
}
}
So, my main question is this: is this the best I can do with AutoMapper in this situation, or is there some other more effective method that I can use?