Breeze Expand无法与EF一起使用WebAPI



我发布了一个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?

相关内容

最新更新