我发布了一个返回项目列表的 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; }
}