[英]Automapper and mapping list within a complex object / nested mappings
我有一段时间从旧的映射标准转换为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文件生成的。
所以基本上这里的问题是,你想从每个地图LibraryItemCategory
属于一个LibraryItem
到LibraryCategoryModel
包括从每个属性LibraryItemCatalog
的LibraryCatalog
财产。
首先,您要将集合正确映射到彼此:
Mapper.CreateMap<LibraryItem, LibraryItemModel>()
.ForMember(
dest => dest.Categories,
opt => opt.MapFrom(src => src.LibraryItemCategories));
接下来,你需要担心每个映射LibraryItemCategory
内LibraryItem.LibraryItemCategories
到LibraryCatalogModel
。 如问题中所述,您需要访问每个LibraryItemCategory
的LibraryCatalog
属性,并实际上从中映射。 这看起来的方式是:
Mapper.CreateMap<LibraryItemCategory, LibraryCategoryModel>()
.ConstructUsing(ct => Mapper.Map<LibraryCategoryModel>(ct.LibraryCategory))
.ForAllMembers(opt => opt.Ignore());
在这里,我们告诉AutoMapper是从映射LibraryItemCategory
到LibraryCategoryModel
,我们需要构建LibraryCategoryModel
使用另一个调用的Mapper.Map
在内LibraryCategory
财产。
接下来,剩下要做的就是定义从LibraryCategory
到LibraryCategoryModel
的映射:
Mapper.CreateMap<LibraryCategory, LibraryCategoryModel>();
现在调用Mapper.Map
在LibraryItem
应该照顾一切的为您服务。
或者,您可以将LibraryItemCategory
中的地图移除到LibraryCategoryModel
并使用LINQ创建您实际想要从LibraryItem
到LibraryItemModel
的映射定义中映射的LibraryCategory
集合:
Mapper.CreateMap<LibraryItem, LibraryItemModel>()
.ForMember(
dest => dest.Categories,
opt => opt.MapFrom(
src => src.LibraryItemCategories.Select(lb => lb.LibraryCategory)));
你显然仍然需要从LibraryCategory
到LibraryCategoryViewModel
的映射,但你可能更喜欢这个,因为它涉及更少的映射。
尝试类似的东西
Mapper
.CreateMap<LibraryItemModel, EF.Entities.LibraryItem>()
.ForMember(
dest => dest.LibraryItemCategories,
opt => opt.MapFrom(src => src.LibraryItemCategories )
);
所以你声明你的嵌套属性将被映射到的位置。
您可以在文档站点上找到另一个示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.