rest - 在 .NetCore 2.1 中使用 DTO 和 OData
问题描述
我正在使用 InMemoryDatabase 编写测试 OData Rest API。我想使用 DTO(s) 来隐藏 SQL 模型并调整一些字段(地理位置等)。但是,当我使用ProjectTo<...>
AutoMapper 中的方法时,对 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();
}
}
}
电火花模型:
private static IEdmModel GetEdmModel()
{
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Offer>("Offers");
return builder.GetEdmModel();
}
解决方案
我找到了解决方案。
事实上,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; }
}
}
推荐阅读
- vue.js - 如何在 vuejs 中绑定转换名称属性?
- c++ - 代码块编译错误`_Z16draw_hello_worldPvS_`不能在制作共享对象时使用;使用 -fPIC 重新编译
- python - 从moviepy导入cairo bug
- javascript - 如何在 Laravel 项目中为 React 添加多个入口点
- java - 安卓; 使用 getExternalFilesDir 时下载的文件未在 android 中显示;
- react-native - 如何在 Expo 项目中使用 react-native-image-marker 包(Expo 包中未记录的包)?
- amazon-web-services - 迭代并在胶水DynamicFrame中找到ChoiceType
- maven -
当另一个配置文件触发时不起作用 - excel - MATCH / Exact SEARCH 从表定义中检索标题
- python - 将波斯语字符串 ( UTF-8 ) 从 laravel API 传递到 python 文件