4

プロジェクトで問題に直面しましたが、ベア テスト プロジェクトで問題を再現しました。

私は次のdtosを持っています:

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.

もちろん、これはオートマッパーの問題です。

今、私は次のことを試しました:

 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により結果の直接マッピングが null 値 (または Id の場合は 0) になります。そのためcontext.Users.ProjectTo<AppUserDto>().FirstOrDefault()(または でさえMapper.Map<AppUserDto>(context.Users.FirstOrDefault())) 常にAppUserDtoその小道具のデフォルト値を持つ を返します。

では、同じベース dto で同じタイプのネストされた複数の dto オブジェクトを、その dto オブジェクトの直接マッピングを犠牲にすることなく機能させるにはどうすればよいでしょうか?

ProjectUsing で問題を解決すること (直接マッピングを同時に機能させることができる場合) は理想的とは言えませんが、それが唯一の方法である場合はなんとかなります。

編集:

バグがある可能性が最も高く、これは興味のある人のための github の問題です。

4

1 に答える 1