在.NetCore 2.1中将DTO与OData一起使用

时间:2019-06-20 09:29:27

标签: rest asp.net-core odata automapper dto

我正在使用InMemoryDatabase编写测试OData Rest API。 我想使用DTO隐藏SQL模型并调整一些字段(地理位置等)。 但是,当我使用AutoMapper中的users方法时,对API的GET请求返回一个空集合,而不是实际结果列表。

您对我在做什么错有任何想法吗?

这是控制器:

ProjectTo<...>

自动映射器声明:

namespace offers_api.Controllers
{
    public class OffersController : ODataController
    {
        private readonly OfferContext _context;
        private IMapper _mapper;

        public OffersController(OfferContext context, IMapper mapper)
        {
            _context = context;
            _mapper = mapper;
        }

        [EnableQuery]
        public IActionResult Get()
        {
            IQueryable<Offer> res = _context.Offers.ProjectTo<Offer>(_mapper.ConfigurationProvider); // <-- works without ProjectTo !
            return Ok(res);
        }
    }
}

EDM模型:

namespace offers_api.Entities
{
    public class Mapping : Profile
    {
        public Mapping()
        {
            //CreateMap<CategoryEntity, string>().ConvertUsing(cat => cat.Name ?? string.Empty);
            CreateMap<LocationEntity, Location>()
                .ForMember(x => x.longitude, opt => opt.MapFrom(o => 0))
                .ForMember(x => x.latitude, opt => opt.MapFrom(o => 0))
                .ReverseMap();
            CreateMap<OfferEntity, Offer>()
                .ForMember(x => x.Category, opt => opt.MapFrom(o => o.Category.Name))
                .ReverseMap()
                .ForMember(x => x.Category, opt => opt.MapFrom(o => new CategoryEntity { Name = o.Category }));
            CreateMap<OfferPictureEntity, OfferPicture>().ReverseMap();
            CreateMap<UserEntity, User>().ReverseMap();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方法。

实际上,自动映射器加载的数据比OData的默认行为更多。 要约与其作者之间的关系由不可为空的前键描述。我没有在数据库中插入任何作者,但是OData尝试加载用户,并发现它在USER表中丢失,因此它丢弃了Offer结果。

解决方案:使外键为空。

namespace offers_api.Entities
{
    public class OfferEntity
{
        [Key]
        public long Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public long AuthorId { get; set; } // <== Bug here : add long? to resolve it...
        public virtual UserEntity Author { get; set; }
    }
}