我有这个简单的类
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/