2012-12-13 39 views
0

尝试按自述文件中的指令运行新项目时收到以下错误。使用WebAPI和Breeze的新项目失败

1:查询托多斯

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

UPDATE:

我检查我的事件查看器,看看,我从来没有试图在我的机器上进行调试时见过的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; 
} 

虽然种方法工作,并且数据库被丢弃,并用种子值重新填充,我得到的0响应项目在上面的'结果'中。

回答

5

更新:12月15日

信息的关键部分...该问题的原因......是利用预发行-SPA模板的。

该模板是不一样的MVC 4 的Web API或微风文档

SPA模板和MVC更新中描述模板包括ASP.NET的开端Web API支持OData查询。他们刺伤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.

如果你不能通过这一点,我不认为这是一个微风的问题。微风尚未做任何事情。我会在你的环境中寻找意想不到的东西。

让我们知道它到底是怎么回事;如果仍然卡住,我们将准备好接下来的步骤。

+0

是的,我使用此代码返回六个项目。当然,我仍然遇到错误,特别是现在我们正在转换为List。再进一步,我使用AsQueryable()将返回类型转换为IQueryable,但仍然得到相同的错误。 – dizzyguy

+0

一条额外的信息。当我尝试评估'_contextProvider.Context的返回类型。Todos在调试期间 - 使用最初的代码,而不是你发送的内容 - 我得到了一个有趣的回应。即使我在调用调试器后立即评估调用,看起来好像调用即时超时。 我收到以下错误:功能评估被禁用,因为之前的功能评估超时。您必须继续执行才能重新启用功能评估。 – dizzyguy

+0

此外,有趣的是,如果我使用下面的代码,并在itemList中设置断点... 'var items = _contextProvider.Context.Todos; var itemList = items.ToList(); 回报项目;' ....我得到这个错误: _Cannot DROP DATABASE“BreezeSampleContext-20121213144159”,因为它是目前在use._ – dizzyguy

0

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

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

+0

数据库正在按预期丢弃和再生,并且种子数据正在填充。但是,当我运行该应用程序时,出现上述错误。我能够配置应用程序使用SQL Express和MDF文件,并且都以相同的结果结束。在SQL Express中,我收到登录失败消息。我没有收到任何与MDF有关的SQL相关错误。最奇怪的部分是返回类型是IQueryable ,但该应用程序抛出一个错误,抱怨返回类型为List。这对我来说没有意义。无处可返回List类型的集合。 – dizzyguy

+0

这可能没有多大的帮助,但我看到我的开发箱上正在记录相同的事件。您是否从“开箱即用”更改了BreezeSample控制器?如果是的话,你可以发布Todos操作代码吗?我打赌你没有,但它值得一试。 – adamlj

+0

我没有......除了上面提到的更新。我想从ContextProvider中捕获任何异常和返回值。响应不是例外,但返回计数为0. – dizzyguy