我向OData控制器发出POST请求,该控制器具有附加到实体的导航属性,我希望在POST结束后返回所有这些。相反,只返回在DB表中具有代表该实体的列的实体的属性。
这是我正在调用的方法:
// POST: odata/Links
public async Task<IHttpActionResult> Post(Link link)
{
link.ImageId = HelperModule.GetThumb(link.WebsiteUrl, 400, 300);
link.CreatedOn = DateTime.Now;
db.Links.Add(link);
await db.SaveChangesAsync();
/* now that we have the link saved to the database we need to add it to the attached views */
foreach (BoardLink bl in link.BoardLinks)
{
bl.LinkId = link.LinkId;
bl.IsActive = true;
db.BoardLinks.Add(bl);
}
await db.SaveChangesAsync();
return Created(link);
}
这是实体:
public class Link
{
public DateTime? CreatedOn { get; set; }
public String Description { get; set; }
public String ImageId { get; set; }
[Key]
public int LinkId { get; set; }
public String Name { get; set; }
public String WebsiteUrl { get; set; }
/// <summary>
/// Last modified time for this object.
/// </summary>
[Timestamp]
public Byte[] TimeStamp { get; set; }
public ICollection<LinkGradeLevel> LinkGradeLevels { get; set; }
public ICollection<LinkCategory> LinkCategories { get; set; }
[NotMapped]
public List<BoardLink> BoardLinks { get; set; }
}
以下是该实体的表格:
当我在返回POST方法时设置断点时,我可以看到它设置了LinkGradeLevels,LinkCategories和BoardLinks。上述三个项目是导航属性。我确实在edm模型中配置了它们,如下所示:
/// <summary>
/// Creates the model for odata endpoints.
/// </summary>
/// <returns>The IEdmModel for OData.</returns>
private static IEdmModel GenerateEdmModel()
{
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Board>("boards");
builder.EntitySet<BoardLink>("boardlinks");
builder.EntitySet<Category>("categories");
builder.EntitySet<GradeLevel>("gradelevels");
builder.EntitySet<Link>("links");
builder.EntitySet<LinkCategory>("linkcategories");
builder.EntitySet<LinkGradeLevel>("linkgradelevels");
return builder.GetEdmModel();
}
当链接返回到客户端时,它不包含任何导航属性,只包含CreatedOn,Description,ImageId,LinkId,Name,WebsiteUrl和Timestamp。为什么是这样?我是否必须做一些特别的事情才能让它在POST请求中全部返回?
编辑:我确实想要注意,我已经将方法的返回类型设为链接,并且无法正常工作并返回我已经提到过的内容。我还尝试在当前的POST方法结束时返回以下内容:
return Ok(Link);
这也没有用,它只是返回了我上面列出的相同内容。
答案 0 :(得分:0)
如果您从OData提供程序请求数据,则可以包括$extend
以包含内联引用的资源。这可以是隐式或显式的(参见EnableQueryAttribute
)。
在POST数据上,根据OData specs,服务器是“......在响应中将资源的最终状态发送回客户端”。和“正在创建的条目可能包含服务中其他条目的链接。”
我假设Microsoft读取此内容,因为要返回的信息只是正在创建的对象。要再次检索完整对象,您必须再次使用GET检索数据。