1

Breeze、Typescript、MVC 5.2、Knockout、Entity Framework webapp があります。ユーザーがグリッド (kogrid) の行をクリックしたときに、ユーザー エンティティの値を更新しようとしました。値は entityChanged イベントハンドラーに保存されます (すべきです) が、Fiddler では、プロパティ値が変更されておらず、entityAspect.entityState が Modified に設定されていることがわかります (!) originalValuesMap には古い TenantId があり、地図。

次のように、エンティティ変更イベントをサブスクライブします。

this.EntityManager.entityChanged.subscribe((data: breeze.EntityChangedEventArgs) => {
    if (data.entityAction == breeze.EntityAction.PropertyChange) {
                return this.EntityManager.saveChanges(<breeze.Entity[]> new Array(data.entity))
                    .fail((error) => alert("Failed. " + error));}

        });

データはイベント ハンドラに正しく到着します。savechanges 呼び出しが行われますが、変更された値 (tenantId) は変更されていません。

rowclick のイベント ハンドラは次のとおりです。

ViewModel).OnRowClick = (tenantId: KnockoutObservable<System.IGuid>, viewModel: Imp.Scripts._TenantListViewModel) => {
        entityManager.fetchEntityByKey("User", viewModel.Settings().CurrentUser().UserId(), false)
        .then(entityKeyResult => {
            (<Imp.Classes.UserBreeze>entityKeyResult.entity).CurrentTenantId(tenantId());
            //entityManager.saveChanges(<breeze.Entity[]> new Array(entityKeyResult.entity));
         })
        .fail((error)=> alert("Error setting current tenant. " + error));});

entityChanged サブスクリプションを無効にして、コメント アウト行 entityManager.saveChanges.... を有効にすると、エンティティは正しく保存されます。行のコメントを外してもサブスクリプションを維持すると、機能しません。

変更されたエンティティを変更後に自動的に保存するにはどうすればよいですか?

編集: 回避策は、現在のユーザーの値 CurrentTenantId を変更する前に、entityChanged イベントハンドラーを一時的に無効にし、エンティティを手動で保存して、entityChanged イベントを再サブスクライブすることです。しかし、この解決策はにおいがします。

4

1 に答える 1

1

いくつかの提案:

  1. propertychanged イベントが頻繁に発生する場合は、保存を調整することを検討してください。Knockout には、この目的のためのレート制限エクステンダーがあります。
  2. また、ブリーズ セーブ キュー プラグインの使用を検討して、セーブ コールの重複を心配する必要がないようにすることもできます。
  3. 保存の問題をトラブルシューティングするには、saveChanges を呼び出す直前に次のコードを追加してみてください。

if (data.entityAction === breeze.EntityAction.PropertyChange) { var pcArgs = <breeze.PropertyChangedEventArgs>data.args; console.log('Property Changed. PropertyName: ' + pcArgs.propertyName + '; Old Value: ' + (pcArgs.oldValue ? pcArgs.oldValue.toString() : 'null') + '; New Value: ' + (pcArgs.newValue ? pcArgs.newValue.toString() : 'null') + ';'); }

于 2014-07-23T18:51:34.803 に答える