0

我正在尝试使用 Breeze 查询 ASP.Net Web API 端点,但查询失败 - 数据对象包含:

internalError: TypeError
arguments: Array[2]
0: "createCtor"
1: null
length: 2
__proto__: Array[0]
get message: function () { [native code] }
get stack: function () { [native code] }
set message: function () { [native code] }
set stack: function () { [native code] }
type: "non_object_property_load"

数据对象有一个消息(和响应文本)属性,其中包含来自查询的完整 json 响应,看起来不错,并且生成的元数据与响应匹配 - 它还记录响应的状态 200

所以我猜有某种问题将响应映射到客户端的对象?

我正在使用 Breeze 版本 0.85.2 的 NuGet 包

我可以让示例 ToDo 项目在同一环境中正常运行

我的项目确实使用了来自不同程序集和命名空间的域对象、上下文等,但我知道这个版本支持吗?

此外,其中一个属性是枚举 - 在元数据中定义为{\"name\":\"State\",\"type\":\"Edm.Self.State\",\"nullable\":\"false\"}]但在响应中作为整数出现

寻找有关如何在客户端进一步调试的提示

更新

将工作示例与我的代码进行比较,错误似乎来自此函数:

/**
Returns the constructor for this EntityType.
@method getEntityCtor
@return {Function} The constructor for this EntityType.
**/
ctor.prototype.getEntityCtor = function () {
    if (this._ctor) return this._ctor;
    var typeRegistry = this.metadataStore._typeRegistry;
    var aCtor = typeRegistry[this.name] || typeRegistry[this.shortName];
    if (!aCtor) {
        var createCtor = v_modelLibraryDef.defaultInstance.createCtor;
        if (createCtor) {
            aCtor = createCtor(this);
        } else {
            aCtor = function() {
            };
        }
    }
    this._setCtor(aCtor);
    return aCtor;
};

v_modelLibraryDef 上的 defaultInstance 属性在我的运行代码中未定义 - 我在微风的配置中遗漏了什么?

更新 2 - 已解决,但为什么

好的,所以我得到了这个工作 - 我错过了对淘汰赛的参考(我打算使用但没有那么远) - 我有点被没有提到淘汰赛的微风先决条件误导了所以如果有人可以解释我如何在没有淘汰赛的情况下完成这项工作,如果它是一个错误,那么要点是你的

4

4 回答 4

1

得到了同样的错误,并且引用了 knockout.js 有帮助(我正在为我的应用程序使用 angularjs)

  manager.executeQuery(query).then(function(data) {
        console.log(data);
    });

但。看来,默认情况下,数据映射器与淘汰赛一起使用,因此我们将 XHR 结果作为带有可观察的 KO 模型。

所以我添加了breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);

现在我没有收到 data.results 作为可观察的集合。

希望我的回答会有所帮助。

于 2013-02-02T14:07:48.367 回答
0

此错误看起来与您的 Entity 类型构造函数之一有关。我猜您在代码中的某处调用了“registerEntityTypeCtor”方法。如果是这样,那么我会在您在那里注册的构造函数中放置一个断点。

根据您的其他评论,.NET 枚举应该在微风客户端上转换为整数。这是唯一可以支持它们的“原始”数据类型。当您调用“EntityManager.saveChanges”时,它们将被转换回服务器上的枚举

Breeze 不需要“淘汰”,您也可以使用“angularjs”或“backbone”。如果您不指定另一个库,我们只是将微风客户端默认为淘汰赛。请参阅此处的“breeze.config.initializeAdapterInstance”主题。我们确实需要更好地记录这一点。

于 2013-01-23T17:45:44.373 回答
0

每次我收到响应的 Message 属性是 json 格式的数据的错误时,这意味着我在获取数据后运行的函数中有一个错误。

例子:

dataservice.getPalanca(routeData.PalancaID)
.then(function (data) {
    self.palanca(data.results[0]);
})
.fail(function (error) {
    console.log(error); /*if I get here and error.Message == correct json almost always means error in .then function*/
    toastr.error("Ha ocurrido un error al obtener los datos");
});

我希望我能帮助你。

于 2013-01-23T14:39:43.357 回答
0

对不起,你让理查德挣扎了。我们会努力从中吸取教训,让下一个人免于遭受您所承受的痛苦。

FWIW,我们并不是说 Knockout 是先决条件……因为KO 不是先决条件。您可以改用 Angular 或 Backbone,我们预计将来会有其他替代方案。

当您刚刚学习 Breeze 时,我们不想让您淹没在配置选项中。所以我们选择了 KO 作为默认的模型库(就像 jQuery 是默认的 AJAX 提供者,而 Web API 是默认的“数据服务”技术一样)。我们在很多地方都这么说;先决条件看起来像另一个好地方提到它。

碰巧的是,您无论如何都打算使用 KO,因此无需进行任何配置。大多数人从包含 KO 的 MVC 模板之类的东西开始,并在 Index.cshtml 中为您加载它。

显然,您是从零开始的(也许是“ASP 空 Web 应用程序”?)。Breeze Web API NuGet 包力求备用,因此不包括 KO。我们认为(错误地)你会自己添加它......以正确的脚本顺序......如果你想使用 KO。显然,我们可以更好地记录这个特定的开发路径……尤其是我们自己非常喜欢它。感谢您指出

另一个问题是异常没有帮助。您可以从其他尝试回答您的问题中看到,即使有 Breeze 经验的人也无法识别出问题所在。我们将看看我们是否可以更早地检测到丢失的脚本并抛出一个带有更好消息的异常。

于 2013-01-23T18:57:25.027 回答