Breeze扩展不使用EF的Web API

时间:2013-07-01 08:09:11

标签: entity-framework asp.net-web-api breeze

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

2 个答案:

答案 0 :(得分:1)

您的网址似乎缺少展开查询选项的$ ...应为$expand

答案 1 :(得分:0)

我认为我发现了问题 - 使用HttpResponseMessage返回类型的IQueryable与纯IQueryable返回类型的行为不同。当我不包装它时,expand似乎有效。

我在这里提出了一个新问题: How to use Breeze IQueryable with CORS?