0

現在、breast.js (バージョン 1.3.4) を使用して小さな Hmtl/JavaScript アプリケーションを開発しています。OData プロトコルを使用してエンティティをクエリするように構成しました。

シンプルなエンティティで問題なく動作します。複雑なエンティティ (電話番号と住所の 2 つの複雑なタイプのプロパティを持つ連絡先エンティティ) をクエリしている場合、次のエラーが表示されます。

"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>

奇妙な複合型名に関して気付いたもう 1 つの点は、entities プロパティが複合型のコレクションであることです (連絡先には複数のアドレスがある場合があります)。行 14085 のチェックは常に isScalar = true を返しますが、代わりに複雑な配列を作成する必要があります。

複合型の OData メタデータに問題はありますか? この問題をどのように解決できますか?

ご回答ありがとうございます。

乾杯、マーク

4

2 に答える 2

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 サンプルのスキーマを調べましたが、複雑なデータ プロパティの例は見つかりませんでした。サンプル バンドルに含まれているノースウィンド スキーマは機能しますが、それを自分のスキーマで機能させる方法がわかりません。

于 2013-11-15T21:21:55.483 に答える
0

Breeze は現在、スカラー複合型と複合型の配列の両方をサポートしています。

ただし、 EntityManager.createEntityを使用してエンティティとその複合型の値を 1 回のパスで作成すると、バグが発生します。これは、約 1 週間後の次のリリースで修正される予定です。

したがって、今のところ、以下は機能しません。(以下の例の「場所」は、「場所」タイプの複雑なプロパティであり、それ自体が他のいくつかのプロパティを持つと仮定します)

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 に答える