Automapper: 部分映射

14

我正在使用Automapper将数据从objectA传输到objectB。

classe ObjectA
{
   string Title;
   string Summary;
}

classe ObjectB
{
   string Title;
   string Summary;
   IAddress Address;
}

我创建了这两个对象之间的这种映射关系

AutoMapper.Mapper.CreateMap<IObectA, IObjectB>()
      .ForMember(dest => dest.Title,           src => src.MapFrom(s => s.Title))
      .ForMember(dest => dest.Summary,         src => src.MapFrom(s => s.Summary))
      .ForMember(dest => dest.Address,         src => src.Ignore())

我创建了ObjectB并填充了它的所有属性,包括Address。

当我调用映射器时,我希望它覆盖Title和Summary并忽略Address。

ObjectB = Mapper.Map<IObjectA, IObjectB>(objectA); 

实际上,它对 Address 抛出了异常。

我做错了什么?

[更新]换句话说,我有我的 ObjectB,并且我想使用来自 ObjectA 的数据更新其中的一部分。当我说“忽略”时,我的意思是保留数据原来的样子。


可能知道你收到了什么异常会很有用... - JoDG
似乎您的一切操作都是错误的。您的代码示例中重复定义了ObjectA类。稍后您说填充ObjectB的所有属性,但在最后一个代码片段中,它显示您试图将objectA映射到objectB,而不是反过来。 - JoDG
@JoDG,我的错误。我更新了我的初始帖子。 抛出了类型为“System.Collections.Generic.KeyNotFoundException”的异常。 - user385411
我不知道异常来自哪里。 不过,你的实际问题似乎与这个完全相同: https://dev59.com/XXA65IYBdhLWcg3wuRB8 - JoDG
是的,但这是一个非常简单的情况。 如何使用AutoMapper更新现有对象实例? - user385411
1
除了 AutoMapper,您还可以使用 ValueInjecter。使用它,此操作将仅为 ObjectB.InjectFrom(ObjectA),而无需任何配置。 - Omu
1个回答

36

我找到了解决方案。

我刚刚发现Map方法有一种重载版本,可以接受一个预先实例化的目标对象。感谢这篇文章

Mapper.Map<IObjectA, IObjectB>(objectA, ObjectB ); 

@JoDG,感谢你的帮助。


3
该链接所指向的文章已经不存在了... :( - noocyte
2
@noocyte:Archive.org支持你!http://web.archive.org/web/20130124102758/http://www.dominicpettifer.co.uk/Blog/45/automapper---a-custom-type-converter-that-exposes-a-destination-value - James P. Wright
3
只是一个提醒,你不需要在<>中指定类型:Mapper.Map(objectA, ObjectB);就足够了。 - DomenicDatti

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