Ich versuche, Automapper-Projektionen auf Entity Framework IQueryables zu verwenden.Automapper 4.2.1 LINQ-Projektionen funktionieren nur mit statischer Mapper.CreateMap?
Beim Start der Anwendung, ich alle meine Mapping-Profile erstellen und hinzufügen, die Karten mit der nicht-statischen CreateMap-Methode erstellen.
Alle diese Profile sind in meinem IoC-Container registriert.
Ich bekomme die fehlende Mapping-Ausnahme, obwohl ich das Mapping-Profil in der Instanz meiner MappingConfiguration sehe.
Was könnte das Problem sein? Fehle ich etwas? Ich benutze Automapper 4.2.1
Ich habe festgestellt, dass beim Hinzufügen einer statischen Mapper.CreateMap funktioniert es gut. Funktionieren Projektionen nur mit statischer API? Ich möchte die statische API vermeiden.
vollständiger Code:
public class ItemEntityToItemView : Profile
{
public override void Configure()
{
CreateMap<ItemEntity, ItemView>();
// Without this line, I get missing Map type configuration.
Mapper.CreateMap<ItemEntity, ItemView>();
}
}
public interface IEntitiesProjector
{
IQueryable<T> SelectTo<T>(IQueryable source);
}
public class EntitiesProjector : IEntitiesProjector
{
private readonly IMapperConfiguration _mapperConfig;
public EntitiesProject(IMapperConfiguration mapperConfig)
{
_mapperConfig = mapperConfig;
}
public IQueryable<T> SelectTo<T>(IQueryable source)
{
return source.ProjectTo<T>(_mapperConfig);
}
}
public class ItemsRepository : IITemsRepository
{
public IQueryable<ItemEntity> GetById(int id)
{
return _dbSet.Where(x => x.Id == id);
}
}
public class Service
{
private readonly IEntitiesProjector _projector;
public Service(IEntitiesProject entitiesProjector)
{
_projector = entitiesProjector;
}
public List<T> GetItem(int id)
{
IQueryable<ItemEntity> itemsQueryable = ItemsRepository.GetById(id);
return _projector.SelectTo<ItemView>(itemsQueryable);
}
}
My Autofac registration :
builder.RegisterAssemblyTypes().AssignableTo(typeof(Profile)).As<Profile>();
builder.Register(c => new MapperConfiguration(cfg =>
{
cfg.CreateMap<IdentityUser, AspNetUser>().ReverseMap();
})).AsSelf().As<IMapperConfiguration>().SingleInstance();
builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();
builder.Register<EntitiesProjector>().As<IEntitiesProjector>().SingleInstance();
senden Sie Ihre Codebeispiel –
Mein Profil hinzugefügt .. soll es funktionieren? Oder ist bekannt, dass Projektionen nur bei Verwendung der statischen API funktionieren? –
Wenn ich 'ProjectTo()' 'verwende, muss ich einen generischen Typparameter hinzufügen und eine Mapperkonfiguration als Parameter bereitstellen. Sie haben von denen in Ihrem sehr unvollständigen Fragecode nie. Btw: Ich benutze'AutoMapper.QueryableExtensions; ', um meine 'ProjectTo' Überladung Erweiterungen zu bekommen – grek40