Breeze.js OData - 复杂类型失败 - >无法调用null的方法'_createInstanceCore'

时间:2013-05-23 09:24:04

标签: breeze

我们目前正在使用breeze.js(版本1.3.4)开发一个小型Hmtl / JavaScript应用程序。我们配置使用OData协议来查询实体。

使用简单的实体它可以正常工作。如果我们要查询复杂的实体(具有电话号码和地址的两个复杂类型属性的联系实体),我们会收到以下错误:

"TypeError: Cannot call method '_createInstanceCore' of null
    at ctor.startTracking (<ServerAddress>/scripts/breeze.debug.js:14086:49)
    at Array.forEach (native)
    at ctor.startTracking (<ServerAddress>1/scripts/breeze.debug.js:14069:12)
    at new ctor <ServerAddress>/scripts/breeze.debug.js:2952:52)
    at proto._createEntityCore (<ServerAddress>1/scripts/breeze.debug.js:6478:9)
    at mergeEntity <ServerAddress>/scripts/breeze.debug.js:12458:39)
    at processMeta (<ServerAddress>/scripts/breeze.debug.js:12381:24)
    at visitAndMerge (<ServerAddress>/scripts/breeze.debug.js:12361:16)
    at <ServerAddress>/scripts/breeze.debug.js:12316:33
    at Array.map (native)
From previous event:
    at executeQueryCore (<ServerAddress>/scripts/breeze.debug.js:12290:77)
    at proto.executeQuery (<ServerAddress>/scripts/breeze.debug.js:11243:23)
    at DataContext.executeCachedQuery (<ServerAddress>/App/services/datacontext.js:138:33)
    at DataContext.getContactsBySearchParams (<ServerAddress>/App/services/datacontext.js:111:25)
    at Search.searchCmd.ko.asyncCommand.execute (<ServerAddress>/App/viewmodels/search.js:34:38)
    at Search.ko.asyncCommand.self.execute (<ServerAddress>/scripts/knockout.command.js:57:29)
    at HTMLButtonElement.ko.bindingHandlers.event.init (<ServerAddress>/scripts/knockout-2.2.1.debug.js:2318:66)"

在调试代码时,我们看到,复杂属性实例的dataType字段为null:

val = prop.dataType._createInstanceCore(entity, prop.name);

我们还可以看到complexTypeName具有奇怪的值格式,如:

<ComplexTypeName>):#<NameSpace>

我们注意到有关奇怪的复杂类型名称的另一件事是,entities属性是复杂类型的集合(联系人可能有多个地址)。对14085行的检查总是返回isScalar = true,但应该创建一个复杂的数组。

复杂类型的OData元数据是否存在问题?我们怎么能解决这个问题?

提前感谢您的回答。

干杯, 马克

2 个答案:

答案 0 :(得分:0)

Breeze目前支持标量复杂类型和复杂类型数组。

但是使用 EntityManager.createEntity 在一次传递中创建实体及其复杂类型值存在一个错误。这将在大约一周的下一个版本中修复。

所以现在以下内容不起作用。 (假设以下示例中的“位置”是“位置”类型的复杂属性,本身具有其他几个属性)

var supplier = em.createEntity("Supplier", 
   { companyName: "XXX", location: { city: "LA" } }
);

但是以下内容(假设您正在使用微风Angular / backingStore impl - 淘汰代码看起来会有所不同)

var supplier = em.createEntity("Supplier", { companyName: "XXX" });
supplier.location.city = "San Francisco";
supplier.location.postalCode = "91333";

或以下

var supplier = em.createEntity("Supplier", { companyName: "XXX" });
var locationType = em.metadataStore.getEntityType("Location");
supplier.location = locationType.createInstance(
   { city: "Boston", postalCode: "12345" }
);

答案 1 :(得分:0)

我看到了与微风1.4.5相同的问题。 我的元数据如下:

{  "shortName":"Phone",
   ...
   "dataProperties":[ {"name":"phoneNumber", 
                    "complexTypeName":"PhoneNumber#mynamespace",
                    "isScalar":true }]
   ...
},
{"shortName":"PhoneNumber",
 "namespace":"mynamespace",
 "isComplexType":true,
 "dataProperties":[ ... ]
}

我的客户端代码拨打电话:

var newPhone = manager.createEntity('Phone', {phoneNumber:{num: "234-2342"}});

(PhoneNumber复杂类型中有更多属性,但您还没有图片)。 微风代码(与orignal poster相同的调用堆栈)尝试取消引用未定义的dataType字段,并抛出异常:

if (prop.isDataProperty) {
    if (prop.isComplexProperty) {
         if (prop.isScalar) {
               val = prop.dataType._createInstanceCore(entity, prop);
         } else {
               val = breeze.makeComplexArray([], entity, prop);
         }

我浏览了Zza示例的架构,没有找到复杂数据属性的示例。示例包中包含Northwind架构,但我不确定如何使用我的架构。