gpt4 book ai didi

Automapper 忽略忽略属性

转载 作者:行者123 更新时间:2023-12-04 07:10:45 26 4
gpt4 key购买 nike

在映射深度(即级别 > 1)对象模型时,我想忽略某些属性。

以下测试工作正常:

class Foo
{
public string Text { get; set; }
}

class Bar
{
public string Text { get; set; }
}

Mapper.CreateMap<Foo, Bar>()
.ForMember(x => x.Text, opts => opts.Ignore());

var foo = new Foo { Text = "foo" };
var bar = new Bar { Text = "bar" };
Mapper.Map(foo, bar);
Assert.AreEqual("bar", bar.Text);

但是,当我尝试执行相同的映射但将 Foo 和 Bar 作为父类上的属性时,以下测试失败:
class ParentFoo
{
public Foo Child { get; set; }
}

class ParentBar
{
public Bar Child { get; set; }
}

Mapper.CreateMap<ParentFoo, ParentBar>();

Mapper.CreateMap<Foo, Bar>()
.ForMember(x => x.Text, opts => opts.Ignore());

var parentFoo = new ParentFoo
{
Child = new Foo { Text = "foo" }
};

var parentBar = new ParentBar
{
Child = new Bar { Text = "bar" }
};

Mapper.Map(parentFoo, parentBar);
Assert.AreEqual("bar", parentBar.Child.Text);

automapper 不是忽略 Child 类的文本(即保留为“bar”),而是将值设置为 null。我的映射配置有什么问题?

最佳答案

Automapper 可以通过两种方式执行映射。第一种方法是简单地将源对象提供给 Automapper,它会创建一个新的目标对象并为您填充所有内容。这是大多数应用程序使用 Automapper 的方式。但是,第二种方法是为其提供源和现有目的地,Automapper 将使用您的映射更新现有目的地。

在第一个示例中,您为其提供了一个现有的目标值,因此 Automapper 将使用它。在第二个示例中,Automapper 将为 ParentFoo 和 ParentBar 进行映射,但是当它到达 Child 时,它将创建一个新的 Child 然后进行映射(这是默认行为)。这会导致 Text 属性为空。如果您想使用现有的 Child 对象,您需要配置 Automapper 以使用 UseDestinationValue 执行此操作:

Mapper.CreateMap<ParentFoo, ParentBar>()
.ForMember(b => b.Child, o => o.UseDestinationValue());

这将使您的测试通过(只要您在设置 parentBar.Child.Text 时去掉第一个空格!)。

关于Automapper 忽略忽略属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5401502/

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