【问题标题】:OData Post returns basic entity without navigation propertiesOData Post 返回没有导航属性的基本实体
【发布时间】:2015-03-17 23:55:24
【问题描述】:

我有一个向 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 请求中返回?


编辑:我确实想指出,我已将方法的返回类型设为 Link,但它不起作用并返回了我提到的已经发生的事情。我还尝试在我拥有的当前 POST 方法的末尾返回以下内容:

return Ok(Link);

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 规格很合理。不过那真是太可惜了。现在,如果我只想坚持使用 OData,我必须打一个额外的电话。我可能只使用普通的 ApiController 方法来提高效率。
    • 你说的是 GET 修改数据?我个人不喜欢走那条路。
    猜你喜欢
    • 2018-08-30
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多