【问题标题】:AutoMapper Projections are not applied不应用 AutoMapper 投影
【发布时间】:2020-04-30 00:35:36
【问题描述】:

我正在尝试创建一个框架来抽象我的实体层,但是为了使其工作,我需要自动映射器项目才能工作,这样我就可以查询我的 DTO 而不是查询实体

[TestMethod]
public async Task Verify_Mapping_Projection_Behavior()
{
    var projectionModifier = "Alabastar";
    var services = this.GetRegisteredRestEzServiceCollection();
    var serviceProvider = services.BuildServiceProvider();
    var context = (AstootContext)serviceProvider.GetService<DbContext>();

    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<User, UserDTO>().ForMember(x => x.FirstName, 
            o => o.MapFrom((entity, dto) => entity.FirstName + projectionModifier));
    });

    var mapper = config.CreateMapper();

    // Hack: we'll verify exeuction happens in sql
    // using the behavioral differene between in memory and sql (case insensitivity)
    var sqlOnlyModifier = projectionModifier.ToUpper();
    var userDTO = mapper.ProjectTo<UserDTO>(context.Users)
        .Where(x => x.FirstName.Contains(sqlOnlyModifier))
        .FirstOrDefault();

    Assert.IsNotNull(userDTO);
}

我的测试失败了,所以我决定直接实现投影。当我具体化时,我可以看到我的 projectionModifier 没有被添加到 firstName 属性中。

如何让项目映射我的修饰符,以便我可以将我的 DTO 用作 Sql Queryables?

【问题讨论】:

  • @LucianBargaoanu,我已经阅读了文档,我的项目根本没有被应用,不仅仅是在 sql 中,它们甚至不会出现在内存中。
  • 没错,就是这样。在 SQL 中它可能会崩溃和运行时,但那是其他的。
  • @LucianBargaoanu,如果 SQL 在运行时崩溃不应该不返回数据,当我调用列出时它仍然可以正常实现
  • 您当然可以找到一些工作示例,并准确找出您做错了什么。例如github.com/AutoMapper/AutoMapper/tree/master/src/….

标签: c# .net-core automapper projection


【解决方案1】:

MapFrom 的 3 参数重载需要赋值。这可以通过使用 2 参数重载来解决。

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<User, UserDTO>()
        .ForMember(dto => dto.FirstName, 
            opt => opt.MapFrom(entity => entity.FirstName + projectionModifier));
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多