2

我有从 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 名称
 -------- --------
 1 家长 1

孩子:

ChildId ParentId Position CategoryName CategoryValue
-------- -------- -------- ------------ -------------
1 1 1 内容 事物
2 1 1 组 GroupOne
3 1 2 内容 事物
4 1 2 组 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对象。第一个孩子的 a 应Position为 1,Contents值为“Things”,Group值为“GroupOne”。第二个孩子应该有一个Position2、一个Contents“Things”和一个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 做的最好的事情,还是有其他更有效的方法可以使用?

4

1 回答 1

0

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

于 2010-02-18T18:08:23.050 回答