AutoMapper ProjectTo在使用FirstOrDefault时失败

5

我正在使用AutoMapper ProjectTo将Person实体映射到EmployeeDto。在我的EmployeeDto中,我有一个单独的AddressDto属性需要捕获。因为Person有一个Address集合,所以我定义了我的映射来捕获第一个地址:

.ForMember(d => d.Address, s => s.MapFrom(m => m.Addresses.FirstOrDefault())

问题在于当我将其包含在我的映射中时,会收到一个错误,指定的类型成员“IsDeleted”不受支持... IsDeleted是Person上的基本属性,并带有属性[NotMapped]。我的EmployeeDto不包括IsDeleted属性。
当我查看IQueryable表达式属性时,我得到了这个:
System.Data.Entity.Core.Objects.ObjectQuery`1[MyProject.Data.Core.Entities.Person]
.MergeAs(MergeOption.AppendOnly)
.Where(
    // Quoted to induce a closure:
    a => a.FirstName.Contains(param.Value))
.Select(
    // Quoted to induce a closure:
    dto => new 0_Culture=neutral_PublicKeyToken=null>
    {
        IsDeleted = dto.IsDeleted,
        UpdateDate = dto.UpdateDate,
        CreateDate = dto.CreateDate,
        Id = dto.Id,
        …remaining Person entity properties removed for brevity,
        Addresses = dto.Addresses,
        Address = dto.Addresses.FirstOrDefault()
    })
.Select(

    // Quoted to induce a closure:
    dto => new EmployeeDto
    {
        …all employeedto property removed for brevity,
        Address = (dto.Address != null) ? new AddressDto { Id = dto.Address.Id } : null
    })

以下是我的映射代码(ForSourceMember() 部分是我尝试的一种方法,但它无法解决问题 - 无论是否使用都会产生相同的结果):

configuration.CreateMap<Person, EmployeeDto>()
            .ForSourceMember(s => s.IsDeleted, x => x.Ignore())
            .ForSourceMember(s => s.CommonProperties, x => x.Ignore())
            .ForSourceMember(s => s.Events, x => x.Ignore())
            .ForMember(d => d.PersonId, s => s.MapFrom(m => m.Id))
            .ForMember(d => d.PersonType, s => s.UseValue(PersonTypes.Employee))                
            .ForMember(d => d.StatusType, s => s.MapFrom(m => m.PersonStatusType.Type))
            .ForMember(d => d.Status, s => s.MapFrom(m => m.PersonStatusType.Code))
            .ForMember(d => d.Address, s => s.MapFrom(m => m.Addresses.FirstOrDefault()))
            ;

我地址(AddressDto)有一个类似的 CreateMap 定义,用于将 Address 映射到 AddressDto。
此外,当这些相同的对象是另一个DTO对象的子项时,映射起作用。希望这对某人能识别我的问题足够了。
编辑解决方法 - 添加条件将起作用。 由于某种原因,它会防止 IQueryable 表达式创建 .Select(dto => new 0_Culture=neutral_publickkeytoken=null> 块:
.ForMember(d => d.Address, s => s.MapFrom(m => m.Addresses.Count > 0 ? m.Addresses.FirstOrDefault() : null)

我假设没有目标成员需要忽略(不适用于ForSourceMember)。你能移除IsDeleted属性的setter吗? - Lucian Bargaoanu
目标上不存在 IsDeleted,而且我无法从实体(源)中删除 setter。 - chadb
那你就卡住了 :) 我想不出其他的解决办法。 - Lucian Bargaoanu
这个问题已经 修复。请尝试使用 MyGet 构建版本。 - Lucian Bargaoanu
有关这个问题有什么新消息吗?我正在使用版本8,但它仍然无法正常工作。 - emanuel.virca
@emanuel.virca 有点晚了 :), 不过提供一个复现会很有帮助。请创建一个gist,以便我们可以执行并查看失败情况。 - Lucian Bargaoanu
1个回答

1
这是一个EF Core问题,在EF Core 3.0中已经修复。有关该问题的更多详细信息,请参见https://github.com/dotnet/efcore/issues/15399
作为解决方法,您可以使用.Take(1)并投影到ICollection

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接