AutoMapper DynamicMap使用以前创建的TypeMap失败

时间:2015-03-02 13:49:24

标签: c# automapper

我有一个实体,一个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方法。

有人能为我提供更好的解决方案吗?也许我太松散地选择类型地图了?也许有更好的方法来实现我想要做的事情。

0 个答案:

没有答案