【问题标题】:New project fails using WebAPI and Breeze新项目使用 WebAPI 和 Breeze 失败
【发布时间】:2012-12-16 03:01:05
【问题描述】:

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

1:查询待办事项

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 错误 -

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

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

【问题讨论】:

    标签: breeze


    【解决方案1】:

    更新: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 过滤器。我们的待办事项中有更新 Breeze ODataActionFilterAttribute 以便它禁用 MS Web API OData 处理仅适用于 Breeze 控制器。我们还没有打扰,因为此时 SPA 模板仍然是非官方的。对于随机数...您不能在同一个站点中混合使用 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 个。

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

    请告诉我们当您达到这一点时的情况;如果仍然卡住,我们将为下一步做好准备。

    【讨论】:

    • 是的,我使用此代码获得了六件商品。当然,我仍然得到一个错误,尤其是现在我们正在转换为一个列表。更进一步,我使用 AsQueryable() 将返回类型转换为 IQueryable,但仍然得到相同的错误。
    • 一条额外的信息。当我在调试期间尝试评估“_contextProvider.Context.Todos”的返回类型时——使用初始代码,而不是你发送的代码——我得到了一个有趣的响应。尽管我在调用调试器后立即评估调用,但调用似乎立即超时。我收到以下错误:函数评估已禁用,因为之前的函数评估超时。您必须继续执行才能重新启用函数评估。
    • 另外,有趣的是,如果我使用以下代码,并在 itemList 处设置断点...var items = _contextProvider.Context.Todos; var itemList = items.ToList(); return items; ....我收到此错误:Cannot drop database "BreezeSampleContext -20121213144159",因为它当前正在使用中。
    • 注意:在上面的评论中,我没有在任何工具中打开数据库。就好像 ContextProvider 正在锁定数据库。代码通过第 1 行就好了,但是当我尝试转换 items.ToList() 时,我得到了数据库错误。
    • 此线程确定某些事情与您的 EF 和 db 环境有关,而与 Breeze 显然无关。你得到的“上下文”是一个原始的 EF DbContext。您可以通过启动您自己的 DbContext 实例并尝试使其工作来验证这一点。忘记退货;尝试获取 Todos 几次。如果您愿意,我可以尝试在我的机器上运行它:在ideablade dot com 上通过微风发邮件给我
    【解决方案2】:

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

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

    【讨论】:

    • 数据库正在按预期删除和重新生成,并且正在填充种子数据。但是,当我运行该应用程序时,出现上述错误。我能够将应用程序配置为同时使用 SQL Express 和 MDF 文件,并且都以相同的结果结束。在 SQL Express 中,我收到了 Login Failed 消息。我没有收到任何与 MDF 相关的 SQL 错误。最奇怪的部分是返回类型是 IQueryable,但应用程序会抛出一个错误,抱怨返回类型是 List。这对我来说毫无意义。我没有返回 List 类型的集合。
    • 这可能没有太大帮助,但我看到我的开发盒上记录了相同的事件。您是否从“开箱即用”中更改了 BreezeSample 控制器?如果是这样,您可以发布 Todos 操作代码吗?我敢打赌你没有,但值得一试。
    • 我没有...除了上面提到的更新。我想从 ContextProvider 捕获任何异常和返回值。响应也不例外,但返回计数为 0。
    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多