【问题标题】:Automapper returns empty objects using ProjectTo<>Automapper 使用 ProjectTo<> 返回空对象
【发布时间】:2020-12-09 11:27:20
【问题描述】:

我是 Automapper 的新手,正在尝试将实体框架数据库对象映射到 DTO。

我的数据库对象OfficeLookup 包含CodeDescription(以及我不关心的其他属性)。 我的OfficeDto 包含IdName 属性。

映射:

private MapperConfiguration OfficeMapperConfiguration =>
    new MapperConfiguration(
        cfg =>
            {
                cfg.CreateMap<OfficeLookup, OfficeDto>()
                    .ForMember(dest => dest.Id, act => act.MapFrom(src => src.Code))
                    .ForMember(dest => dest.Name, act => act.MapFrom(src => src.Description));
            });

还有我的代码:

public IEnumerable<OfficeDto> GetOfficeDtos() => OfficeLookup.ProjectTo<OfficeDto>(OfficeMapperConfiguration); // returns an Ienumerable of empty OfficeDTOs

奇怪的是,我有另一个更复杂的映射,用于另一个工作正常的表。我不明白为什么这张地图没有。

我的映射生成的表达式是

ObjectQuery<OfficeLookup>.MergeAs(MergeOption.AppendOnly).Select(dtoOfficeLookup => new OfficeDto())

这看起来不对。另一个映射生成一个正确设置各种属性的表达式(Office 值除外。我假设一旦我可以得到这个独立映射,我就能修复嵌套映射)。

【问题讨论】:

  • @IvanStoev 你确实是对的,我的错,太早了,还没喝咖啡 :-) 很抱歉

标签: entity-framework automapper


【解决方案1】:

问题应该出在相应的OfficeDto 属性中,更具体地说,是缺少属性设置器,在这种情况下,AutoMapper 只是将它们从投影中跳过,即使它们已被显式映射。

例如该问题通过以下类重现:

class OfficeDto
{
    public int Id { get; }
    public string Name { get; }
}

并添加属性设置器(甚至是私有的)修复它:

class OfficeDto
{
    public int Id { get; private set; }
    public string Name { get; set; }
}

【讨论】:

  • 并且已修复!非常感谢伊万。今天早些时候,我已经经历了很多,并让它们成为仅获取属性,认为 AutoMapper 会使用构造函数。现在一切正常:)
  • 我明白了。您可以告诉 AM 使用带有 .ConstructUsing(...) 的构造函数,但 EF6 不会接受这种投影(尽管 EF Core 会)。使用属性设置器更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多