具有相同类型嵌套Dto的Dto失败



我在一个项目中遇到了一个问题,并成功地在一个裸测试项目中重现了它。

我有以下文件:

public class AppUserDto
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class IssueDto
{
    public int Id { get; set; }
    public AppUserDto Owner { get; set; }
    public AppUserDto Creator { get; set; }
}

对应的模型是完全相同的,除了有模型关系而不是dto(显然)。

AutoMapper配置:

Mapper.CreateMap<AppUser, AppUserDto>().MaxDepth(1);
Mapper.CreateMap<Issue, IssueDto>().MaxDepth(1);
最简单的查询:

var i = context.Issues.ProjectTo<IssueDto>().FirstOrDefault();

这总是抛出一个NotSupportedException:

The type 'AppUserDto' appears in two structurally incompatible initializations within a single LINQ to Entities query. A type can be initialized in two places in the same query, but only if the same properties are set in both places and those properties are set in the same order.

这当然是automapper的问题。

现在我尝试了以下内容:

 Mapper.CreateMap<AppUser, AppUserDto>().MaxDepth(1)
       .ProjectUsing(u => new AppUserDto
       {
            Id = u == null ? -1 : u.Id,
            Name = u == null ? null : u.Name,
       });

这使得像context.Issues.ProjectTo<IssueDto>()...这样的查询成功。但这反过来使AppUser的直接映射结果为空值(或0为Id)。所以context.Users.ProjectTo<AppUserDto>().FirstOrDefault()(甚至Mapper.Map<AppUserDto>(context.Users.FirstOrDefault()))总是返回一个AppUserDto与默认值的道具。

那么,如何使多个嵌套的相同类型的dto对象在相同的基本dto中工作,而不牺牲dto对象的直接映射?

用ProjectUsing解决问题(如果我们可以同时使直接映射工作)不太理想,但如果这是唯一的方法,我可以管理。

编辑:

很可能有一个bug,这是github的问题,如果你感兴趣的话

罪魁祸首实际上是MaxDepth调用本身。这可能看起来不是这样,但在每个映射上粘贴MaxDepth可能会产生副作用,正如我所看到的。

事实证明,我的Dtos上根本没有递归(这就是MaxDepth的作用)。因此,只要删除所有MaxDepth调用就可以解决这个问题,而不需要ProjectUsing

这里已经被清除了

相关内容

  • 没有找到相关文章

最新更新