开发者

How can I map this parent-child relationship in AutoMapper?

开发者 https://www.devze.com 2022-12-20 03:11 出处:网络
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:

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 obje开发者_如何转开发cts. 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?


Typically in these cases we map straight from SqlEntityChild to DomainChild, as lists, arrays and such are automatically supported. You just need to set up mappings for the element types, given that there is no extra logic besides iterating over the original Children collection.

0

精彩评论

暂无评论...
验证码 换一张
取 消