OData Post返回没有导航属性的基本实体

时间:2015-03-17 23:55:24

标签: c# entity-framework asp.net-web-api odata

我向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; } 
}

以下是该实体的表格:

Link Table

当我在返回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);

这也没有用,它只是返回了我上面列出的相同内容。

1 个答案:

答案 0 :(得分:0)

如果您从OData提供程序请求数据,则可以包括$extend以包含内联引用的资源。这可以是隐式或显式的(参见EnableQueryAttribute)。

在POST数据上,根据OData specs,服务器是“......在响应中将资源的最终状态发送回客户端”。和“正在创建的条目可能包含服务中其他条目的链接。”

我假设Microsoft读取此内容,因为要返回的信息只是正在创建的对象。要再次检索完整对象,您必须再次使用GET检索数据。