【问题标题】:Using DTO with OData in .NetCore 2.1在 .Net Core 2.1 中使用 DTO 和 OData
【发布时间】:2019-06-20 09:29:27
【问题描述】:

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

你知道我做错了什么吗?

这里是控制器:

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);
        }
    }
}

自动映射器声明:

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();
        }
    }
}

EDM 模型:

private static IEdmModel GetEdmModel()
{
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<Offer>("Offers");
    return builder.GetEdmModel();
}

【问题讨论】:

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


    【解决方案1】:

    我找到了解决办法。

    事实上,automapper 加载的数据比 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; }
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2019-01-14
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多