如何在AutoMapper中映射此父子关系?

时间:2010-02-16 16:29:17

标签: c# automapper

我有从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; }
}

在此模型中,它是SqlEntityParentSqlEntityChild之间的标准一对多关系。一些有代表性的数据将是......

父:

 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值为“Things”,Group值为“GroupOne”。第二个孩子应该有Position的2,Contents的“事物”和Group的“GroupTwo”。

我很乐意使用ValueResolvers在AutoMapper中设置一对一的自定义映射,但我不确定如何最好地处理这个问题。我为父实体创建了下面的解析器和关联映射,它们在一次传递中映射了整个子实体列表,但它看起来很傻,因为我必须在这个解析器类中手动完成子对象的整个映射。

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做的最好的,还是我可以使用其他更有效的方法?

1 个答案:

答案 0 :(得分:0)

通常在这些情况下,我们直接从SqlEntityChild映射到DomainChild,因为列表,数组等都是自动支持的。您只需要为元素类型设置映射,因为除了遍历原始Children集合之外没有额外的逻辑。