0

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

1:查询待办事项

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

更新:

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

用户“我的机器\用户名”登录失败。原因:无法打开明确指定的数据库。[客户: ]

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 个项目的响应。

4

2 回答 2

5

更新:12月15日

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

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

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

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

config.EnableQuerySupport(); // 与 Breeze 的 ODataActionFilter 冲突

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

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

我们有一个 Breeze 版本的新 SPA 模板正在运行,几乎可以发布了。我将很快写下它,并将通过链接更新此答案。

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


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

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

[HttpGet]
公共 IQueryable Todos() {
    var items = _contextProvider.Context.Todos.ToList(); // 测试查询
    返回_contextProvider.Context.Todos;
}

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

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

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

于 2012-12-14T09:06:01.573 回答
0

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

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

于 2012-12-13T23:55:13.217 回答