我有从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 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做的最好的,还是我可以使用其他更有效的方法?
答案 0 :(得分:0)
通常在这些情况下,我们直接从SqlEntityChild映射到DomainChild,因为列表,数组等都是自动支持的。您只需要为元素类型设置映射,因为除了遍历原始Children集合之外没有额外的逻辑。