我们正在使用Entity Framework Core,并且有一组实体都共享同一个基类。
我们希望使用AutoMapper的
我们目前正在尝试通过类型推断和扩展方法来实现此操作:
我们所面临的问题出现在我们的
public class EntityBase { ... }
public class FirstEntityChild : EntityBase { ... }
public class SecondEntityChild : EntityBase { ... }
我们使用这个功能可以在编译时不需要知道是 FirstEntityChild
还是 SecondEntityChild
,从而查询其中任一实体子类。
为了向视图提供数据,我们有视图模型。
public class FirstEntityChildViewModel { ... }
public class SecondEntityChildViewModel { ... }
我们希望使用AutoMapper的
ProjectTo
,将查询结果从数据库实体映射到视图模型。我们已经设置好了从FirstEntityChild
到FirstEntityChildViewModel
,以及从SecondEntityChild
到SecondEntityChildViewModel
的映射配置文件。但是我们没有EntityBase
的映射。我们目前正在尝试通过类型推断和扩展方法来实现此操作:
public static IQueryable<TDestination> ProjectTo<TSource, TDestination>(
this IQueryable<TSource> query,
TSource sourceTypeInstance,
TDestination destinationTypeInstance,
IConfigurationProvider configuration)
{
return query.ProjectTo<TDestination>(configuration);
}
我们将其用于如下场景,假设 sourceType
可能是 FirstEntityChild
或者 SecondEntityChild
,targetType
可能是 FirstEntityChildViewModel
或者 SecondEntityChildViewModel
,而且两者仅在运行时才知道:
var sourceInstance = Activator.CreateInstance(sourceType);
var targetInstance = Activator.CreateInstance(targetType);
var results = await query
.ProjectTo(sourceInstance, targetInstance, mapper.ConfigurationProvider)
.ToListAsync();
我们所面临的问题出现在我们的
ProjectTo
扩展内。当我在那一行调试并停下时,sourceTypeInstance
和 destinationTypeInstance
在调试器中会分别显示为 FirstEntityChild
和 FirstEntityChildViewModel
。但是当该行执行时,AutoMapper 试图将映射从 EntityBase
到 object
, 而我们没有这个映射配置文件(而且我认为这甚至不可能):
InvalidOperationException: Missing map from EntityBase to System.Object. Create using Mapper.CreateMap.
有没有可能指示 AutoMapper 应该使用实际的派生类型?或者我们现在只是碰到了泛型的限制?
FirstEntityChild
到FirstEntityChildViewModel
的映射?还是只有从EntityBase
到其他东西的映射? - Vidmantas BlazeviciusFirstEntityChild
到FirstEntityChildViewModel
和从SecondEntityChild
到SecondEntityChildViewModel
的映射。没有从EntityBase
到其他任何内容的映射。感谢您指出这一点,我已经编辑了问题以反映这一点。 - Jimmydefault(TSource)
映射到default(TDestination)
是否更好?既然你打算从EF中获取源,那么为什么还需要sourceInstance
呢? - Vidmantas Blazeviciusmapper.ConfigurationProvider
可能没有保存你的映射配置。 - Vidmantas Blazevicius