AutoMapper - 映射子列表时非常奇怪的行为

时间:2013-02-07 16:53:25

标签: c# .net entity-framework automapper

这肯定是一个特殊的问题,在找到同样问题的人之后,我希望能找到真正了解问题的人。

我有,说:

public class ViewModel
{
     public string TestString { get; set; }
     public ChildObject Child { get; set; }
     public List<Children> Children { get; set; }
}

现在,当我在控制器中映射我的对象时...即

TestObject testObject = Repository.GetObject() // This is my Entity Framework object (with dynamic proxies attached to it)
Mapper.Map(ViewModel, testObject);

并且,我的映射定义为:

Mapper.CreateMap<ViewModel, TestObjectType>();
Mapper.CreateMap<ViewModelChildView, TestObjectChildType>();

一切都映射得很好,所以我的ViewModel设置正确,我的表格。但问题呢?这是有趣的部分。

正如我的原始对象一样,

ChildObject是一个DynamicProxy(实体框架)。但是,List<Children>被设置为普通列表(即使原始列表是List<Children>的DynamicProxy)。

反过来,这意味着实体框架无法访问此列表,因为它未正确绑定到上下文。我整天都试着找一个没有运气的解决方法。那里有什么想法吗?

修改

这些是我的实际对象绑定:

 Mapper.CreateMap<CompanyViewModel, Company>();
 Mapper.CreateMap<CompanyCategoryViewModel, CompanyCategory>(); // I've ever tried removing this line.
 Mapper.CreateMap<List<CompanyCategoryViewModel>, List<CompanyCategory>>();

控制器:

Mapper.Map(companyViewModel, company);

公司对象=动态代理 CompanyCategories列出子对象(公司),地图,但仍然不是动态代理。

2 个答案:

答案 0 :(得分:2)

您既需要Child对象类型的映射,也需要集合的映射。如果您有List<>,则需要在List<>中指定CreateMap(它不适用于IEnumerable

Mapper.CreateMap<ViewModel, TestObjectType>();
Mapper.CreateMap<ViewModelChildView, TestObjectChildType>();
Mapper.CreateMap<List<ViewModelChildView>>, List<TestObjectChildType>>();

以下是包含我的repro代码的GIST

为了完成图片,我使用了最新的AutoMapper预先实现版本2.2.1-ci9004.

答案 1 :(得分:1)

所以基本上我认为唯一的区别就是如何创建地图。

可能在

旁边
   Mapper.CreateMap<ViewModelChildView, TestObjectChildType>();

你还应该创建一个像

这样的列表映射
   Mapper.CreateMap<IEnumerable<ViewModelChildView>, IEnumerable<TestObjectChildType>>();