我有一个实体,一个DTO和一个模型。
我手动创建DTO和Enities之间的映射,例如
CreateMap<ProductPackage, ProductPackageDto>();
CreateMap<PackagedProduct, PackagedProductDto>();
对于DTO to Model,我依赖Mapper.DyamicMap&lt;&gt;使用以下方法:
public static T Map<T>(this IData source)
where T : IData
{
if (source == null)
{
return default(T);
}
TypeMap map = source.GetTypeMap<T>();
T destination = map == null ? Mapper.DynamicMap<T>(source) : (T)Mapper.Map(source, map.SourceType, map.DestinationType);
return destination;
}
因此,当没有现有的类型映射时,DynamicMap将接管并为此实例创建映射。
如果我有一个实体,有一个子实体(包括(x =&gt; x.Children)又称虚拟列表),我使用硬编码的TypeMaps从实体映射到DTO,然后从DTO转到模型,我使用DynamicMap。
在DynamicMap完成映射后,它会创建TypeMap,并将其添加到Mapper.GetAllTypeMaps()列表中。
我的问题是,如果我使用dbContext进行初始调用,并且没有子项附加到初始实体,然后使用相同的moethods进行第二次调用,但唯一的区别是这次包含了子项(因为它们存在于数据库中)... AutoMapper将使用它创建的先前类型映射映射上一个没有子节点的结果,这次......它将失败。
我用来查找相对TypeMap的代码是:
public static TypeMap GetTypeMap<T>(this IData source)
where T : IData
{
return Mapper.GetAllTypeMaps().FirstOrDefault(tm => tm.SourceType == source.GetType() && typeof(T).IsAssignableFrom(tm.DestinationType));
}
为了解决这个问题,我研究了删除DynamicMap创建的额外TypeMaps,但它看起来没有办法,除了Mapper.Reset(),但这要求我重新创建硬编码的TypeMaps每次我打电话给数据库。
我后来做了什么,补充说:
&& !tm.DestinationType.Name.Contains("Model")
到GetType方法。
有人能为我提供更好的解决方案吗?也许我太松散地选择类型地图了?也许有更好的方法来实现我想要做的事情。