有没有办法使用自动映射器从列表映射到标量 属性?

Is there a way to map from a list to a scalar property using auto mapper?

在我的业务层我有以下objects

class ParentClass
{
    // Parent class properties
    ChildClass PrimaryChild { get; set; }
    ChildClass SecondaryClass { get; set; }
}

class ChildClass
{
    //Child class properties
}

业务规则规定只有一个主要的和一个辅助的child

在 DAL 中,尽管将其设置为标准的一对多关系是有意义的

class ParentEntity
{
    // Parent properties
    IEnumerable<ChildEntity> Children { get; set; }
}

class ChildEntity
{
    // Child properties

    bool IsPrimary { get; set; }

    int ParentId { get; set; }
    ParentEntity Parent { get; set; }
}

这既适用于数据库,又能在业务规则发生变化时提供未来的灵活性。

一切正常,但我发现自己在业务层中手动映射 PrimaryChildSecondaryChild 属性,而其他所有内容都由 automapper 映射。

有没有办法让automapper做这种映射?我没有找到遵循这种结构的例子。

据我所知,这不能隐式完成。

即使存在隐式执行此操作的能力,也需要您明确指出:

  • 应映射到列表中的属性
  • IsPrimary 标志应如何根据其属性设置
  • (对于双向绑定)哪个列表元素应该映射到哪个 属性

举一个简单的例子来说明它可能有多复杂:如果您的列表有多个子项但 none 被标记为主要项怎么办?你怎么会隐含地知道该怎么做?

一旦您已经到了编写这些自定义逻辑位的地步,您基本上就重写了整个手动映射,而框架除了执行您手动编写的步骤外不会真正做太多事情。

大量代码并不能真正为库的功能增加价值。

好吧,它可以用类似的东西来完成:

.ForMember(dest => dest.PrimaryChild ,
            opt => opt.MapFrom(src => src.Children.FirstOrDefault(c => c.IsPrimary)))

.ForMember(dest => dest.SecondaryClass,
            opt => opt.MapFrom(src => src.Children.FirstOrDefault(c => !c.IsPrimary)))

但它依赖于与您解释它的方式一致的源数据以及在映射点设置的 IsPrimary 属性。

如果可行,最好将 ParentClass 更改为包含 ChildClass 的集合,这样您将获得一个直接映射来处理数据不一致,之后您可以根据需要对其进行过滤。