这肯定是一个特殊的问题,在找到同样问题的人之后,我希望能找到真正了解问题的人。
我有,说:
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列出子对象(公司),地图,但仍然不是动态代理。
答案 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>>();