我有从 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”。第二个孩子应该有一个Position
2、一个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 做的最好的事情,还是有其他更有效的方法可以使用?