如何使用AutoMapper忽略目标成员?

3

我有这两个类:

public class MyModel()
{
    public int Id {get; set;}
    public string Name {get; set;}
    public bool IgnoreModel {get; set;}
}

public class MyDto()
{
    public int Id {get; set;}
    public string Name {get; set;}
    public bool IgnoreDto {get; set;}
}

我想忽略 IgnoreModelIgnoreDto 两个类。我的映射代码如下:
Mapper.CreateMap<MyModel, MyDto>().Bidirectional()
.ForMember(model=> model.IgnoreModel, option => option.Ignore())
.ForSourceMember(dto => dto.IgnoreDto, option => option.Ignore());

其中Bidirectional()是一种扩展:

    public static IMappingExpression<TDestination, TSource> Bidirectional<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
    {
        return Mapper.CreateMap<TDestination, TSource>();
    }

然而,我遇到了一个错误,提示IgnoreDto没有被映射:

发现未映射的成员。请查看下面的类型和成员。 添加自定义映射表达式、忽略、添加自定义解析器或修改源/目标类型。

MyModel -> MyDto (目标成员列表) ModelAssembly.MyModel -> DtoAssembly.MyDto (目标成员列表)

未映射的属性: IgnoreDto

如何正确地忽略这种映射?


在我看来,那看起来是正确的。Mapper.AssertConfigurationIsValid() 的输出是什么?另外,出于好奇,删除 Bidirectional() 并手动映射 model->dto 和 dto->model 会有什么区别吗? - Nate Barbettini
Bidirectional 方法来自哪里? - Andrew Whitaker
@AndrewWhitaker 这是我写的一个扩展。 - Ivan-Mark Debono
1个回答

4

在映射后应用您的扩展(返回另一个对象),将使您的映射规则适用于第二个映射。您的第一个映射将没有应用任何规则。

要使其工作,请分别在每个映射上使用ignore:

Mapper.CreateMap<MyModel, MyDto>()
.ForMember(model=> model.IgnoreModel, option => option.Ignore());

Mapper.CreateMap<MyDto, MyModel>()
.ForMember(model=> model.IgnoreDto, option => option.Ignore());    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接