1

サーバーからエンティティとメタデータを取得するとき、カスタム初期化関数は期待どおりにナビゲーション プロパティにアクセスできます。メタデータとエンティティを localstorage にエクスポートして再インポートする場合、ナビゲーション プロパティは使用できません。メソッドが呼び出されるときにインポートする前に、ctor と初期化子がメタデータストアに登録されていることを確認しました。私はそよ風のソースを見てみましたが、項目が完全に設定されてアタッチされる前に、初期化関数が呼び出されているようです。

targetEntity = entityType._createEntityCore();
            updateTargetFromRaw(targetEntity, rawEntity, dataProps, true);
            if (newTempKeyValue !== undefined) {
                // fixup pk
                targetEntity.setProperty(entityType.keyProperties[0].name, newTempKeyValue);

                // fixup foreign keys
                if (newAspect.tempNavPropNames) {
                    newAspect.tempNavPropNames.forEach(function (npName) {
                        var np = entityType.getNavigationProperty(npName);
                        var fkPropName = np.relatedDataProperties[0].name;
                        var oldFkValue = targetEntity.getProperty(fkPropName);
                        var fk = new EntityKey(np.entityType, [oldFkValue]);
                        var newFkValue = tempKeyMap[fk.toString()];
                        targetEntity.setProperty(fkPropName, newFkValue);
                    });
                }
            }
            *targetEntity.entityAspect._postInitialize();*
            targetEntity = entityGroup.attachEntity(targetEntity, entityState);
            if (entityChanged) {
                entityChanged.publish({ entityAction: EntityAction.AttachOnImport, entity: targetEntity });
                if (!entityState.isUnchanged()) {
                    entityGroup.entityManager._notifyStateChange(targetEntity, true);
                }
            }
        }

        if (targetEntity) {
            targetEntity.entityAspect.entityState = entityState;
            if (entityState.isModified()) {
                targetEntity.entityAspect.originalValuesMap = newAspect.originalValues;
            }
            entityGroup.entityManager._linkRelatedEntities( targetEntity);
        }

post initialize 呼び出しを ._linkRelatedEntities 呼び出しの下に移動すると、クエリの実体化とまったく同じように機能するように見えます

if (targetEntity) {
            targetEntity.entityAspect.entityState = entityState;
            if (entityState.isModified()) {
                targetEntity.entityAspect.originalValuesMap = newAspect.originalValues;
            }
            entityGroup.entityManager._linkRelatedEntities( targetEntity);
            *targetEntity.entityAspect._postInitialize();*
        }

ここで何か不足していますか?これは設計された機能ですか?EntityManager を渡し、entityAspect マネージャーを設定し、loadNavigationProperties を呼び出すことで回避策を見つけましたが、これは冗長に思えます。ブリーズの人々からの洞察は大歓迎です。

ありがとう、ブラッド

4

1 に答える 1