c# - 为什么 AutoMapper 不使用 ProjectTo 映射二级导航属性?

标签 c# asp.net-core automapper

我有这个简单的类

public class Store {
    public int Id { get; set; }

    //Other properties

    [JsonIgnore]
    public ICollection<Product> Products { get; set; }
}

和我的 DTO

public class StoreDetails {
    public int Id { get; set; }

    //Other properties

    public ICollection<Product> Products { get; set; }
}

和我的 Product 类:

public class Product {
    public int? Id { get; set; }

    //Other properties

    public ICollection<ProductAttribute> ProductAttributes { get; set; }
}

我的映射看起来像这样:

var storeDetails = await _context.Stores
    .Include(s => s.Products)
    .ThenInclude(p => p.ProductAttributes)
    .ProjectTo<StoreDetails>(new MapperConfiguration(c => c.CreateProfile("TEST", e => {
        e.CreateMap<Store, StoreDetails>();
    })))
    .SingleOrDefaultAsync(p => p.Id == id);

Store 对象中的一切看起来都很好,但在 StoreDetails 中,ProductAttributes 每次都是 null。

为什么 AutoMapper 不使用 ProjectTo 映射二级导航属性?

注意:我使用的是 AutoMapper 8.1.1。

最佳答案

我认为你应该像这样在你的类中添加虚拟属性

public class Store {
    public int Id { get; set; }

    //Other properties

    [JsonIgnore]
    public virtual ICollection<Product> Products { get; set; }
}

public class StoreDetails {
    public int Id { get; set; }

    //Other properties

    public virtual ICollection<Product> Products { get; set; }
}

也可以这样用Profile来映射

public class StoreProfile : Profile
{
    public StoreProfile ()
    {
        CreateMap<Store, StoreDetails>(MemberList.None).ReverseMap();
    }
}

然后在你的startup.cs中注册

services.AddAutoMapper();

这就是你映射到个人资料的方式

private readonly IMapper _mapper;

var storeDetails = await _context.Stores
    .Include(s => s.Products)
    .ThenInclude(p => p.ProductAttributes)
    .Select(
      x => new ViewModel {
        SomeObject = _mapper.Map<Store, StoreDetails>(x)
      } 
    )
    .SingleOrDefaultAsync(p => p.Id == id);

下面是我使用的版本

<PackageReference Include="AutoMapper" Version="8.0.0" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="6.0.0" />

关于c# - 为什么 AutoMapper 不使用 ProjectTo 映射二级导航属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57361911/

相关文章:

c# - Automapper Intellisense 在 VS2015 中不起作用

asp.net-mvc - 如何将自动映射器用于具有 IEnumerable<T> 属性的 ViewModel

c# - 在不同的 Mvc 解决方案中使用相同的代码

reactjs - react + asp.net core 独立项目托管(部署)建议

Asp.Net Core 1.0(又名 Asp.Net 5)网站会因任何文件更改而刷新吗?

c# - 使用 Swashbuckle Swagger 上传文件

c# - 如何将 AutoMapper 与 Ninject.Web.Mvc 一起使用?

c# - count++和++count,什么时候用哪个?

c# - 在 Xamarin 表单中实现分层 StackLayout 的延迟加载

c# - 如何显示父DIV中的所有div