2011-04-06 84 views
5

我有EF EF生成的具有多个属性的Person类。我也有一个类与几个属性的职业。一个人与多个工作有关,因此乔布斯是人的收集财产。使用AutoMapper将复杂视图模型映射回具有集合属性的模型

我创建了一个视图模型为这样:

public class PersonViewModel 
{ 
    public Person Person{ get; set; } 
    public List<Job> Jobs{ get; set; } 
} 

从我的观点,我张贴PersonViewModel的一个实例。我想使用AutoMapper将这个视图模型映射回Person的一个实例,其Jobs集合属性填充了视图模型中的列表。

这可以完成吗?到目前为止,我曾尝试:

Mapper.CreateMap<PersonViewModel, Person>(); 

,没有运气...

编辑:

OK,这样做实际工作。我发现我在其他地方有一个问题...

我的Person对象也与PersonType表有一对多关系... PersonType成为Person的导航属性,并且自动映射器试图映射此...这是它失败的地方......我成功地传递了一个PersonTypeID来将Person与Person类型关联起来。我认为这将是我需要做的。我怎样才能解决这个问题?

编辑2: 所以基本上在DB我的人表有一个PersonTypeID列(外键PersonType表)......这个被映射为一个导航属性人为PersonType对象...

从我的形式来看,我有一个下拉列表,选择其中通过PersonTypeID财产早在视图模型中的人物对象的人类型...

automapper似乎正在寻找Person的PersonType nav属性的值以映射...我得到一个AutoMapper.AutoMapperMappingException

错误

Destination property: PersonType 
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. 

回答

8

是的,这应该工作。如果模型和视图模型共享相同的属性 - 无论是集合 - 他们将AutoMapper自动映射,但是:

  • 他们需要的是同名
  • 如果映射是双向的,地图需要创建双向的欢迎,并我甚至发现,如果它是单向的,我不得不创建mapboth方式
  • 如果你有JobJobViewModel所以集合是不同类型的(但命名以同样的方式)只需为我们创建一个地图二。

我的直觉是这应该解决您的问题:创建映射两种方式,看看是否有帮助:

Mapper.CreateMap<PersonViewModel, Person>(); 
Mapper.CreateMap<Person, PersonViewModel>(); 

编辑

如果您对您的视图模型的属性和模型和他们是不同的类型,AutoMapper不知道如何转换它们。所以,一个选项是忽略它们:

Automapper: Ignore on condition of

或者你可以使用自定义映射:

http://lostechies.com/jimmybogard/2009/05/06/automapper-feature-custom-type-converters/

+0

你是正确的..我发现我的问题在别处。我编辑了我原来的问题...你会得到一个upvote指向我的正确道路...即时通过今天的投票,虽然:) – stephen776 2011-04-06 21:49:40

+0

谢谢斯蒂芬。好的,你可以详细解释一下你的问题,也许增加一些代码?我在编辑过程中遇到困难。 – Aliostad 2011-04-06 21:52:14

+0

好吧加了一些。希望它有帮助 – stephen776 2011-04-06 21:57:02

0

或尝试反向映射:

Mapper.CreateMap<Person, PersonViewModel>().ReverseMap(); 
相关问题