Automapper: 更新属性值而不创建新对象

348

我如何使用Automapper更新另一个对象的属性值而不创建新对象?

4个回答

602

使用接受现有目标的重载函数:

Mapper.Map<Source, Destination>(source, destination);

是的,它返回目标对象,但这只是一些其他晦涩场景的情况。 它是相同的对象。


38
谢谢,吉米...我之前故意避开AutoMapper,因为我担心学习曲线会影响我的时间安排。现在我正式向你道歉,我之前错过了太多...它比我最初想象的要容易得多。 - Neil T.
22
Automapper 是最实用的库之一。我也长时间避免使用它,时间太长了。今天开始使用它,非常惊讶它使用起来是多么容易。 - mcottingham
6
对我没用。 我试图将相同类型映射,但它返回一个新对象。用户u1、u3 =新用户(); u1 =新用户 { Id = 1, NickName =“vami” };用户u4 = Mapper.Map(u1,u3);Assert.AreEqual(u1.Id,u3.Id); Assert.AreEqual(u1.NickName,u3.NickName); - Péter
8
了解,不需要指定类型参数。只需使用Mapper.Map(source, destination)就可以了。非常简单易用! - Judah Gabriel Himango
2
在4.2.1版本中,NULL的行为是否有所改变?我发现将null映射到对象会返回null;而在2.2.1中,将null映射到现有对象会返回现有对象。 - Peter McEvoy
显示剩余10条评论

41
为了使它工作,即使源和目标类型相同,您也需要为源和目标类型创建CreateMap映射。这意味着如果您想要 Mapper.Map<User, User>(user1, user2); 您需要创建以下映射: Mapper.Create<User, User>()

2
哈!我刚刚发现了相同的问题,并在被接受的答案下添加了一条评论。在我看来,如果没有你的解释,被接受的答案并不完整,但是在我的评论之后,它可能会变得完整 :) - Andrzej Martyna
1
这是一个很好的补充。然而,原始问题并没有提到源和目标的类型,并且也没有要求它们是相同的类型。 - jpaugh
这也是我的问题。必须创建一个将A映射到A的配置文件,然后它才能正常工作。 - Jens Mander

12

如果您希望使用IMapper的实例方法而不是已接受答案中使用的静态方法,可以执行以下操作(在AutoMapper 6.2.2中测试)

IMapper _mapper;
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Source, Destination>();
});
_mapper = config.CreateMapper();

Source src = new Source
{
//initialize properties
}

Destination dest = new dest
{
//initialize properties
}
_mapper.Map(src, dest);

dest将会被更新为与src共享的所有属性值。其独特属性的值将保持不变。

这是相关源代码


0
这里有两件事情需要注意。首先,我们不必指定通用Map调用要映射到的类型。这是因为现在我们正在传递目标对象实例,所以目标类型可以由该对象的类型确定。其次,我们没有将此调用的结果存储在变量中。这是因为目标对象是原地映射的,我们没有创建任何新实例。
AutoMapper.Mapper.Map(sourceObject, destinationObject);

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