Automapper 无法映射单元测试项目中的外键属性

Automapper unable to map foreign key properties in unit test project

我已经声明了一个将实体映射到 DTO 的映射。该 DTO 具有对另一个 DTO 的外键引用,该 DTO 必须使用 ProjectTo 由自动映射器映射。当 运行 解决方案时,这工作得很好,但是当我在我的单元测试中使用映射时,在我从我的 DTO 中删除外键 属性 之前,它不起作用。我认为我的 AutoMapper 设置中缺少某些东西,但我不确定。

模型看起来像这样:

public class PendingReportDto
{
    public Guid Id { get; set; }
    public Guid PatientId { get; set; }
    public long Identifier { get; set; }
    public DatabaseType Database { get; set; }
    public DateTime? ReportedDate { get; set; }
    public PatientDto Patient { get; set; }
    public IdentifierType IdentifierType { get; set; }
}

地图是这样的:

CreateMap<Report, PendingReportDto>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dest => dest.Database, opt => opt.MapFrom(src => src.Database))
            .ForMember(dest => dest.PatientId, opt => opt.MapFrom(src => src.PatientId))
            .ForMember(dest => dest.ReportedDate, opt => opt.MapFrom(src => src.ReportedDate))
            .ForMember(dest => dest.Identifier, opt => opt.MapFrom(src => src.Identifier))
            .ForMember(dest => dest.IdentifierType, opt => opt.MapFrom(src => src.IdentifierType))
            .ForMember(dest => dest.Patient, opt => opt.MapFrom(src => src.Patient));

患者有自己的地图,它自己工作得很好。 上面的地图是这样使用的:

return ReadContext.Reports
            .Where(x => x.Database == databaseType && x.ReportedDate == null)
            .ProjectTo<PendingReportDto>(_mapper.ConfigurationProvider)
            .ToListAsync(cancellationToken: cancellationToken);

这样做时出现以下错误:

System.ArgumentNullException: Value cannot be null. (Parameter 'bindings')

Automapper 在单元测试项目中是这样设置的:

public static class SetupAutomapper
{
    public static IMapper Setup()
    {
        var config = new MapperConfiguration(opts =>
        {
            var profiles = typeof(MappingProfile).Assembly.GetTypes().Where(x => typeof(MappingProfile).IsAssignableFrom(x));
            foreach (var profile in profiles.Distinct())
            {
                opts.AddProfile(Activator.CreateInstance(profile) as MappingProfile);
            }
        });

        return config.CreateMapper();
    }
}

如果我使用 select 语句而不是使用 ProjectTo 映射到我的 DTO,它会起作用。

更新:

进一步调查表明,当 运行 我的单元测试时,罪魁祸首可能是我 运行 一个内存数据库,而不是我的常规数据库。如果我换掉它,即使使用相同的数据集,它也会按预期工作。这可能是 EF Core 内存数据库和自动映射器的错误吗?

所以我很确定我发现了使用 ProjectTo 映射反向导航属性的问题。问题不在于 Automapper 本身或我在测试设置中配置它的方式。

罪魁祸首似乎是数据库提供者:Entity Framework 核心内存数据库。

如果我用 localdb 或常规 MS SQL 数据库交换数据库,它工作得很好。内存数据库提供程序有一定的限制,这似乎限制了 ProjectTo 与 Automapper 的使用。

来源:https://docs.microsoft.com/en-us/ef/core/testing/

如何设置本地数据库:

private static void SetupLocalDb(DbContextOptionsBuilder builder)
{
    builder.UseSqlServer("Server=(localdb)\mssqllocaldb;Database=Testing;Trusted_Connection=True;");
}