我发布了一个WebAPI服务,它返回项目列表。我正在实现Breeze,并设法使其基本上与过滤/排序一起工作。但是,"展开"不起作用。
http://www.ftter.com/desktopmodules/framework/api/dare/dares?$expand=ToUser
您可以在上面的响应中看到ToUserId ForeignKey,但ToUser属性为NULL(用户肯定存在)
您可以在元数据中看到ToUser EF导航属性。
当我在服务器端使用.Include时,我可以用EF填充它,但我不想这样做。
我在扩展上查看了微风教程2:http://learn.breezejs.com/以下是未展开的内容:http://learn.breezejs.com/api/northwind/Products
这里是Expand(您可以看到其他类别信息):http://learn.breezejs.com/api/northwind/Products?$expand=类别
这就是我想做的,但我的没有填满…
更新:我下载了Breeze 1.3.6示例,并在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有关。在当前版本的WebAPI中,使用Breeze和EF似乎确实可以做到这一点。
更新3我已经将其缩小到我的数据库、EF数据库优先和代码优先的差异,但仍然没有发现问题。我已经从模型方法改为代码优先方法,得到了完全相同的结果(即没有扩展)。
例如:如果你在微风网站上查看这个扩展,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=To46557657用户
因此我被难住了。。我不知道为什么这不起作用。
我的代码
[HttpGet]
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public HttpResponseMessage Dares()
{
var response = Request.CreateResponse(HttpStatusCode.OK, (IQueryable<Dare>)contextProvider.Context.Dares);
return ControllerUtilities.GetResponseWithCorsHeader(response);
}
这是从我的EF模型(使用数据库优先)生成的类
public partial class Dare
{
public int DareId { get; set; }
public int ToUserId { get; set; }
public virtual User ToUser { get; set; }
}
您的URL似乎缺少扩展查询选项的$
。。。应为CCD_ 6。
我想我已经发现了问题-具有HttpResponseMessage返回类型的IQueryable的行为与纯IQueryaable返回类型不同。当我不包装它时,展开似乎有效。
我在这里提出了一个新问题:如何使用Breeze IQueryable与CORS?