0

我们目前正在开发一个小型的 Hmtl/ JavaScript 应用程序,使用轻风.js(版本 1.3.4)。我们配置为使用 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 字段为空:

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

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

<ComplexTypeName>):#<NameSpace>

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

复杂类型的 OData 元数据有问题吗?我们如何解决这个问题?

预先感谢您的回答。

干杯,马克

4

2 回答 2

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" }
);
于 2013-05-31T17:57:29.823 回答
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 复杂类型中有更多属性,但您还没有图片)。微风代码(与原始海报相同的调用堆栈)尝试取消引用未定义的 dataType 字段,并引发异常:

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

我浏览了 Zza 示例的架构,没有发现复杂数据属性的示例。示例包中包含的 Northwind 架构可以,但我不确定如何让它与我的架构一起使用。

于 2013-11-15T21:21:55.483 回答