我发布了一个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
并且在这里使用Expand(您可以看到其他类别信息):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 Database First和Code First差异,但仍未确定问题。我已经从模型改为Code First方法,结果完全相同(即没有扩展)。
例如:如果您查看有效的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?$expand=To4657657User
因此我感到难过..我不知道为什么这不起作用。
我的代码
[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; }
}
答案 0 :(得分:1)
您的网址似乎缺少展开查询选项的$
...应为$expand
。
答案 1 :(得分:0)
我认为我发现了问题 - 使用HttpResponseMessage返回类型的IQueryable与纯IQueryable返回类型的行为不同。当我不包装它时,expand似乎有效。
我在这里提出了一个新问题: How to use Breeze IQueryable with CORS?