我有两个班级基础短班
public class ObjectShortEditView
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
全视图
public class ObjectEditView : ObjectShortEditView
{
public string Phone { get; set; }
}
在automapper个人资料中
Mapper.CreateMap<Entity, ObjectShortEditView>().IgnoreAllNonExisting();
Mapper.CreateMap<Entity, ObjectEditView >().IgnoreAllNonExisting();
IgnoreAllNonExistingExtension
public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>
(this IMappingExpression<TSource, TDestination> expression)
{
var flags = BindingFlags.Public | BindingFlags.Instance;
var sourceType = typeof(TSource);
var destinationProperties = typeof(TDestination).GetProperties(flags);
foreach (var property in destinationProperties)
{
if (sourceType.GetProperty(property.Name, flags) == null)
{
expression.ForMember(property.Name, opt => opt.Ignore());
}
}
return expression;
}
问题是,当我尝试从实体映射到完整编辑视图时,它失败了
var view = Mapper.Map<ObjectEditView>(entityFromDb);
有时它会失败并出现异常
Unable to cast object of type 'ObjectShortEditView' to type 'ObjectEditView '.
当我写这篇文章的时候,我知道它可以忽略所有扩展,但为什么它甚至会在我要求将视图映射到全视图时尝试转换为短视图...
答案 0 :(得分:1)
您使用的是AutoMapper第4版吗?甚至可能与EF 6.x结合使用?
看起来这可能与您的主题有关:https://github.com/AutoMapper/AutoMapper/issues/842
然后有一句话:“请考虑降级到AutoMapper 3.3.1”
答案 1 :(得分:0)
我没有尝试您的方案,但有一个.Include<>
语法来帮助继承主题。你会这样声明:
Mapper.CreateMap<Entity, ObjectShortEditView>()
.Include<Entity, ObjectEditView>()
.IgnoreAllNonExisting();
Mapper.CreateMap<Entity, ObjectEditView>().IgnoreAllNonExisting();
也许这可以解决您的问题。