新项目使用WebAPI和Breeze失败

时间:2012-12-13 20:04:13

标签: breeze

尝试按照自述文件中的说明运行新项目时收到以下错误。

1:查询Todos

2:查询失败:控制器'BreezeSample'上的动作'Todos',返回类型为'System.Collections.Generic.List`1 [[MyTasks.Api.Models.BreezeSampleTodoItem,MyTasks.Api,Version = 1.0.0.0 ,Culture = neutral,PublicKeyToken = null]]'不支持查询。确保返回内容的类型是IEnumerable,IQueryable或任一接口的通用形式。

更新:

我检查了我的事件查看器,看到了我在尝试在我的机器上调试时从未见过的SQL错误 -

用户'my-machine \ user-name'登录失败。原因:无法打开显式指定的数据库。 [客户:]

由于某些原因,BreezeSamplesContext生成的数据库似乎无法访问?它是由代码优先生成的,但我无法查询它(显然)。

更新2:

我已将默认方法更改为 -

[HttpGet]
public IQueryable<BreezeSampleTodoItem> Todos()
{
    System.Data.Entity.DbSet<BreezeSampleTodoItem> result = null;
    try
    {
        result = _contextProvider.Context.Todos;
    }
    catch (Exception exc)
    {
        throw new Exception(exc.Message);
    }
    return result;
}

虽然Seed方法有效,并且数据库被删除并使用种子值重新填充,但我在上面的'结果'中得到0项的响应。

2 个答案:

答案 0 :(得分:5)

更新:12月15日

关键信息......问题的原因......是使用预发布SPA模板

该模板与Breeze文档中描述的MVC 4 Web API 模板不同

SPA模板和MVC更新包括对OData查询的ASP.NET Web API支持的开始。他们对OData的刺伤与Breeze发生冲突;这两股力量正在争夺OData查询的所有权。希望我们可以使用他们的,但它缺少必要的功能,例如支持$ select和$ expand。

幸运的是,很容易禁用MS版本以便Breeze占上风。打开 App_Start / WebApiConfig.cs 文件并删除或注释以下内容:

config.EnableQuerySupport(); // conflicts with Breeze's ODataActionFilter

关于“返回类型”的误导性错误应该消失,你应该重新开始营业。

请注意,执行此步骤会关闭整个站点的MS Web API OData过滤器。我们在我们的待办事项上更新了Breeze ODataActionFilterAttribute,以便它禁用仅为Breeze控制器处理的MS Web API OData 。我们还没有打扰,因为此时SPA模板仍然是非官方的。对于nonce ...你不能在同一个站点中混合Breeze和Web API OData查询...除非你准备自己进行每个控制器的过滤器清理。

我们有一个新的SPA模板的Breeze版本正常工作,几乎准备发布。我很快就会写这篇文章,并会用链接更新这个答案。

以下是我之前的回答,主要是因为(a)它描述了如何诊断问题,(b)是评论链的上下文。


让我们重新开始,看看我们是否可以诊断。关闭所有Visual Studio会话(应该停止IIS Express)。启动一个全新的VS会话。在VS 2012中创建MVC4 Web Api应用程序。添加 Breeze.MVC4WebApiClientSample NuGet包。运行它(F5)。还有问题?

如果是这样,让我们​​用一个新的行来更新控制器方法:

[HttpGet]
public IQueryable Todos() {
    var items = _contextProvider.Context.Todos.ToList(); // test the query
    return _contextProvider.Context.Todos;
}

var items ...行上放置一个断点并使用调试器重新运行(F5)。走进那条线。它扔了(不好但有趣)?如果没有,你得到了多少项目?零?你应该有6个。

如果你无法超越这一点,我认为这不是一个微风问题。 Breeze还没有做任何事情。我会在你的环境中寻找意想不到的东西。

当你达到这一点时,让我们知道它是如何形成的;如果仍然卡住,我们将为下一步做好准备。

答案 1 :(得分:0)

每次运行代码时,NuGet的示例都设置为删除并重新创建数据库。您是否碰巧在SQL Management Studio中打开了数据库?我也碰到了这个。

看看BreezeSampleDatabaseInitializer类。查看有关保留服务器会话之间更改的注释。如果更改类以实现DropCreateDatabaseIfModelChanges接口,则只会在更改模型时尝试删除数据库。