Breeze:在填充metadataStore之前无法执行_executeQueryCore

时间:2013-05-17 19:17:58

标签: metadata breeze hottowel

我正在使用随热毛巾模板附带的Breeze v1.1.2,该模板现已扩展为我的项目。我错误地将NuGet包更新到当前的1.3.3(我从未学过)。无论如何,一切都很好,现在不是很多!

我按照发行说明和其他文档中的说明将我的BreezeWebApiConfig文件更改为:

[assembly: WebActivator.PreApplicationStartMethod(
typeof(BreezeWebApiConfig), "RegisterBreezePreStart")]
namespace MyApp.App_Start {
public static class BreezeWebApiConfig {
    public static void RegisterBreezePreStart() {
      GlobalConfiguration.Configuration.Routes.MapHttpRoute(
          name: "BreezeApi",
          routeTemplate: "breeze/{controller}/{action}"
      );}}}

并且config.js文件(为EntityManager构造函数提供serviceName):

var remoteServiceName = 'breeze/breeze';  // NEW version
//var remoteServiceName = 'api/breeze';  // OLD version

如果你有兴趣我的BreezeController:

[BreezeController]
public class BreezeController : ApiController
{
    readonly EFContextProvider<MyDbContext> _contextProvider =
        new EFContextProvider<MyDbContext>();

    [HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }

    [HttpGet]
    public IQueryable<SomeItem> SomeItems()
    {
        // Do stuff here...
    }
}

现在我得到“在填充metadataStore之前无法执行_executeQueryCore”错误。

我在这里缺少什么?

修改 我可能省略了你需要的部分...在SomeItems()方法的上面,实际完成的东西是调用MyDBContext类中的GetMeSomeData()方法。此方法对存储过程进行以下调用以获取数据。

public virtual ObjectResult<SomeItem> GetMeSomeData(string inParam)
    {
        var p = new object[] { new SqlParameter("@inParam", inParam) };
        var retVal = ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<SomeItem>("exec GetData @SN", p);
        return retVal;
    }

现在鉴于我的理解有限,对元数据()的调用并没有失败,但是我不认为回来时实体模型是什么,即使在某个地方,也应该弄明白从我有的实体模型(即SomeItem)? Metadata()的返回字符串没有关于实体的任何信息。有没有办法让它意识到?或者我只是在离开野外玩雏菊时完全离开?

1 个答案:

答案 0 :(得分:1)

根据这份报告很难说。让我们看看Breeze是否正确。

打开浏览器调试工具并查看网络流量。在发生错误之前,您是否看到尝试从服务器获取元数据?如果是这样,它成功了吗?还是404?还是500?错误是什么?

我打赌它甚至没有尝试过。如果没有,通常的原因是你在第一次查询之前尝试了一些Breeze操作......并且你没有明确要求元数据。你试图创建一个实体吗?这需要元数据。

关键是,你必须追踪导致错误的Breeze操作。当然一切都应该工作。世界应该是彩虹和独角兽。当它不是时,我们叹了口气,打破了调试器,并从错误给我们的信息开始。

对于你们其他人来说......升级到新的Breeze版本是一件好事。

快乐编码所有人。

更新后续行动

Breeze不知道如何在后端获取数据。如果查询结果中包含可识别的实体,Breeze将缓存该实体。在查询回调中仍然取决于您,以确保您向调用者传递的内容是有意义的。

你说你的服务器端元数据方法不知道SomeItem是什么?然后它对客户没什么用处。如果它返回一个空字符串,Breeze可能会将其视为“根本没有元数据”,在这种情况下,您应该获得“在填充metadataStore之前无法执行_executeQueryCore”错误消息。顺便说一句,您是否检查了网络流量以确定您的服务器实际返回的内容以响应元数据请求(或者是否有这样的请求)?

在服务器上创建元数据的方法有很多种。最简单的方法是在设计时使用EF ...至少作为建模工具。那个MyDbContext你的是什么?为什么SomeItem不在那里?

如果您不想从服务器生成元数据,也可以在客户端上创建元数据。你必须告诉Breeze客户你做出了这个选择。其中大部分内容在文档"Metadata Format"中进行了解释。

我觉得你有点狡猾。你想偏离快乐的道路......这很酷。但是我们大多数人在跑步之前都需要学会走路。