gpt4 book ai didi

c# - 如何在 AutoMapper 中映射这种父子关系?

转载 作者:太空宇宙 更新时间:2023-11-03 16:55:21 25 4
gpt4 key购买 nike

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

Child:

ChildId  ParentId   Position   CategoryName   CategoryValue-------  --------   --------   ------------   -------------1        1          1          Contents       Things2        1          1          Group          GroupOne3        1          2          Contents       Things4        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; }
}

在此结构中,单个DomainChild 对象由来自两个SqlEntityChild 对象的数据组成,分组由Position 决定子实体的值。因此,这些示例数据代表一个 DomainParent 对象,其中包含两个 DomainChild 对象的列表。第一个 child 的 Position 应为 1,Contents 值为“Things”,Group 值为“GroupOne”。第二个 child 的 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 能做的最好的事情吗,还是有其他更有效的方法可供我使用?

最佳答案

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

关于c# - 如何在 AutoMapper 中映射这种父子关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2274445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com