我有一段时间从旧的映射标准转换为automapper.
这是我的课程
// Models public class BaseModel { public Int64 Id { get; set; } public Guid UniqueId { get; set; } public DateTime? CreateDate { get; set; } public DateTime? LastUpdate { get; set; } } public class LibraryItemModel : BaseModel { public string Name { get; set; } public string Description { get; set; } public string URL { get; set; } public bool IsActive { get; set; } public List<LibraryCategoryModel> Categories { get; set; } } public class LibraryCategoryModel : BaseModel { public string Description { get; set; } } // Entity Classes public partial class LibraryItem { public LibraryItem() { this.LibraryItemCategories = new HashSet<LibraryItemCategory>(); } public long Id { get; set; } public System.Guid UniqueId { get; set; } public string Description { get; set; } public string URL { get; set; } public System.DateTime CreateDate { get; set; } public System.DateTime LastUpdate { get; set; } public bool IsActive { get; set; } public string Name { get; set; } public virtual ICollection<LibraryItemCategory> LibraryItemCategories { get; set; } } // comes from a ternary table in DB... many to many public partial class LibraryItemCategory { public long LibraryItemId { get; set; } public long LibraryCategoryId { get; set; } public System.DateTime CreateDate { get; set; } public System.DateTime LastUpdate { get; set; } public virtual LibraryCategory LibraryCategory { get; set; } public virtual LibraryItem LibraryItem { get; set; } } public partial class LibraryCategory { public LibraryCategory() { this.LibraryCategoryRoles = new HashSet<LibraryCategoryRole>(); this.LibraryItemCategories = new HashSet<LibraryItemCategory>(); } public long id { get; set; } public System.Guid UniqueId { get; set; } public string Description { get; set; } public System.DateTime CreateDate { get; set; } public System.DateTime LastUpdate { get; set; } public virtual ICollection<LibraryCategoryRole> LibraryCategoryRoles { get; set; } public virtual ICollection<LibraryItemCategory> LibraryItemCategories { get; set; } } // Old Conversion code doing it the long way private LibraryItemModel Convert(Entities.LibraryItem libraryItem) { var newLibraryItem = new LibraryItemModel { UniqueId = libraryItem.UniqueId,Name = libraryItem.Name,Description = libraryItem.Description,URL = libraryItem.URL,CreateDate = libraryItem.CreateDate,LastUpdate = libraryItem.LastUpdate,IsActive = libraryItem.IsActive,Categories = new List<LibraryCategoryModel>() }; foreach (var lc in libraryItem.LibraryItemCategories) { var newCategory = new LibraryCategoryModel { UniqueId = lc.LibraryCategory.UniqueId,Description = lc.LibraryCategory.Description,CreateDate = lc.LibraryCategory.CreateDate,LastUpdate = lc.LibraryCategory.LastUpdate }; newLibraryItem.Categories.Add(newCategory); } return newLibraryItem; } // My attempt at automapper to go between the models and entities Mapper.CreateMap<EF.Entities.LibraryItem,LibraryItemModel>(); Mapper.CreateMap<LibraryItemModel,EF.Entities.LibraryItem>(); .ForMember(lim => lim.LibraryItemCategories,o => o.Ignore() Mapper.CreateMap<EF.Entities.LibraryCategory,LibraryCategoryModel>(); Mapper.CreateMap<LibraryCategoryModel,EF.Entities.LibraryCategory>() .ForMember(lcm => lcm.LibraryCategoryRoles,o => o.Ignore()) .ForMember(lcm => lcm.LibraryItemCategories,o => o.Ignore());
无论我如何配置忽略或自定义映射,它似乎都不喜欢这种嵌套.任何Automapper专家都可以告诉我如何使用这样的复杂对象进行映射. enitity类是通过EF6 edmx文件生成的.
解决方法
所以基本上问题在于你想要从属于LibraryItem的每个LibraryItemCategory映射到包含每个LibraryItemCatalog的LibraryCatalog属性的属性的LibraryCategoryModel.
首先,您要将集合正确映射到彼此:
Mapper.CreateMap<LibraryItem,LibraryItemModel>() .ForMember( dest => dest.Categories,opt => opt.MapFrom(src => src.LibraryItemCategories));
接下来,您需要担心将LibraryItem.LibraryItemCategories中的每个LibraryItemCategory映射到LibraryCatalogModel.如问题中所述,您需要访问每个LibraryItemCategory的LibraryCatalog属性,并实际上从中映射.这看起来的方式是:
Mapper.CreateMap<LibraryItemCategory,LibraryCategoryModel>() .ConstructUsing(ct => Mapper.Map<LibraryCategoryModel>(ct.LibraryCategory)) .ForAllMembers(opt => opt.Ignore());
在这里,我们告诉AutoMapper要从LibraryItemCategory映射到LibraryCategoryModel,我们需要使用内部LibraryCategory属性上的另一个Mapper.Map调用来构造LibraryCategoryModel.
接下来,剩下要做的就是定义从LibraryCategory到LibraryCategoryModel的映射:
Mapper.CreateMap<LibraryCategory,LibraryCategoryModel>();
现在,在LibraryItem上调用Mapper.Map应该为您处理所有事情.
或者,您可以将MapItemCategory中的地图移除到LibraryCategoryModel,并使用LINQ创建您实际想要从LibraryItem到LibraryItemModel的映射定义中映射的LibraryCategorys集合:
Mapper.CreateMap<LibraryItem,opt => opt.MapFrom( src => src.LibraryItemCategories.Select(lb => lb.LibraryCategory)));
你显然仍然需要从LibraryCategory到LibraryCategoryviewmodel的映射,但你可能更喜欢这个,因为它涉及更少的映射.