4

我发布了一个返回项目列表的 WebAPI 服务。我正在实施 Breeze 并设法让它基本上与过滤/排序一起工作。但是,扩展不起作用。

http://www.ftter.com/desktopmodules/framework/api/dare/dares?$expand=ToUser

可以在上面的响应中看到 ToUserId ForeignKey,但是 ToUser 属性为 NULL(用户肯定存在)

您可以在元数据中看到 ToUser EF 导航属性。

当我在服务器端使用.Include时,我可以用 EF 填充它,但我不想这样做。

我在这里查看了 Breeze 教程 2 的展开:http ://learn.breezejs.com/ 这是没有展开的: http ://learn.breezejs.com/api/northwind/Products

这里是展开(你可以看到额外的类别信息):http ://learn.breezejs.com/api/northwind/Products?$expand=Category

这就是我想要做的,但我的并没有填补它......

更新: 我下载了Breeze 1.3.6 Samples并在 VS2011 中加载了 DocCode 解决方案。我运行它,看到客户端扩展工作;例如 http://localhost:47595/breeze/Northwind/Orders?$top=1 (不扩展) http://localhost:47595/breeze/Northwind/Orders?$top=1&$expand=Customer (正确扩展客户)。

我检查了 WebAPI 控制器代码,它看起来一样,除了它们使用 EF Code First 而不是 Model First。外键装饰有一个属性:

微风样本有效

[ForeignKey("CustomerID")]
[InverseProperty("Orders")]
public Customer Customer {get; set;}

它只是没有意义......这与我的 WebAPI 控制器或 EntityFramework 关系有关......

更新 2 我下载了最基本的 ToDo Knockout Breeze 示例并将这一行添加到 ToDoItem 类中:public User ToUser { get; set; } 然后我可以展开 WebAPI 调用with http://localhost:63030/breeze/todos/Todos?$expand=ToUser

所以我得出的结论是,这与我使用的是 EntityFramework DB First 而不是 Code First 的事实有关。在当前版本的带有 Breeze 和 EF 的 WebAPI 中似乎确实可以做到这一点。

更新 3 我已将其范围缩小到我的数据库、EF 数据库优先和代码优先差异,但仍未发现问题。我已经从模型更改为代码优先方法,结果完全相同(即没有扩展)。

例如:如果您在可行的 Breeze 网站上查看此扩展http://learn.breezejs.com/api/northwind/Products?%24expand=Category,请尝试将最后一个参数更改为无效字段,它会抛出一个错误,例如: http ://learn.breezejs.com/api/northwind/Products?%24expand=Category1

但是,在我的代码中,它总是忽略此参数并返回所有记录,并且如果 Expand 参数不正确,则永远不会引发异常:http: //www.ftter.com/desktopmodules/framework/api/dare/dares?$展开=To4657657用户

因此我很难过..我不知道为什么这不起作用。

我的代码

    [HttpGet]
    [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
    public HttpResponseMessage Dares()
    {
        var response = Request.CreateResponse(HttpStatusCode.OK, (IQueryable<Dare>)contextProvider.Context.Dares);
        return ControllerUtilities.GetResponseWithCorsHeader(response);
    }

这是我的 EF 模型生成的类(使用 Database First)

public partial class Dare
{
    public int DareId { get; set; }
    public int ToUserId { get; set; }
    public virtual User ToUser { get; set; }
}
4

2 回答 2

1

您的 URL 似乎缺少$扩展查询选项...应该是$expand.

于 2013-07-01T15:00:50.200 回答
0

我想我已经找到了问题 - 具有 HttpResponseMessage 返回类型的 IQueryable 与纯 IQueryable 返回类型的行为不同。当我不包装它时,expand 似乎可以工作。

我在这里提出了一个新问题: 如何将 Breeze IQueryable 与 CORS 一起使用?

于 2013-07-04T17:14:32.750 回答