我有一个奇怪的案例,对于AutoMapper来说我还很陌生,我不知道发生了什么。

我有两节课

public class Person
{
    public List<Friend> Friends {get;set;}
}

public class PersonView : Person
{
    public new List<FriendView> Friends {get;set;}
}

和地图

Mapper.CreateMap<Person, PersonView>().ForMember(d => d.Friends,
    o => o.ResolveUsing<FriendViewResolver>().FromMember(s => s.Friends));

但是,我也有这张地图,它有自己的地图:

Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */);

现在,在FriendViewResolver内部-我为每个Mapper.Map<Friend, FriendView>()调用Mapper.Map<Friend, FriendView>() 但是由于某种原因,它运行后,某些属性会丢失,并且由于跳过代码,似乎AutoMapper在列表上进行了第二遍处理。

我想让FriendViewResolver在列表上运行,因为它正在对整个Friends集合进行递归操作,但是我不明白为什么如果成员有一个解析器规则,则AM要第二遍通过。

我真的希望这有意义。

编辑:当我运行Mapper.Map<Person, PersonView>();会发生问题Mapper.Map<Person, PersonView>(); ,我看到它运行FriendViewResolver并具有正确的结果,但是调试器中的下一步再次运行地图并弄乱了已映射的对象。

===============>>#1 票数:4

PersonView派生自Person。 那不是应该使用AutoMapper的方式。 它应该用于在不同的类之间进行映射。 您似乎要在此处执行的操作是,您有一个域模型Person,并且试图创建将在视图中使用的视图模型PersonView。 很好,这正是您应该做的,只是视图模型不应从域模型派生。 它是独立的。 然后,您可以使用AutoMapper在它们之间进行映射。

因此,您的PersonView类应如下所示:

public class PersonView
{
    public List<FriendView> Friends {get;set;}
}

现在您将有2个映射定义:

Mapper.CreateMap<Friend, FriendView>();
Mapper.CreateMap<Person, PersonView>();

并且当您拥有域模型(Person)的实例时,您将能够映射到视图模型(PersonView)。

===============>>#2 票数:0

我想你可以这样解决:

Mapper.CreateMap<Person, PersonView>();
Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */);

<Person, PersonView>映射应自动尝试映射Friends属性,因为它们具有相同的名称。 <Friend, FriendView>映射应处理实际的属性映射。

  ask by Madd0g translate from so

未解决问题?本站智能推荐: