0

私たちは現在、breeze と typescript を連携させようとしています... angular を使用しているため、breeze の「backingStore」モデル ライブラリを使用する予定です... ko や backbone を使用する予定はありません...

    // configure to use the model library for Angular
    breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);

キー プロパティを含むすべての typescript エンティティ プロパティを設計時に定義しています...エンティティに設計時のキー プロパティとナビゲーション配列プロパティがある場合、「backingStore」の実装が失敗するようです。具体的には、breasts.debug.js の 4470 行目に問題があるようです。

     npValue.forEach(function(iv) {
     iv.setProperty(fkName, newValue);

私が正しく理解している場合、「npValue」は子エンティティを保持する配列である必要があります...この値がnullの場合、上記のコードは失敗します...このコードは、微風がエンティティクライアント側を読み込んでいるときに実行されるようですサーバーへの呼び出し...そして、親の「キー」プロパティがエンティティのコンストラクター関数内のコードで明示的に定義されている場合にのみ発生します。「movePropsToBackingStore」への呼び出しは、プロパティを削除してから再度追加しているように見えます...これがキープロパティに対して行われると、この問題が発生します...

とにかく、これはバグですか、それともそよ風はキー プロパティの明示的な定義をサポートしていませんか? それとも他に何か問題がありますか?この問題を再現するには、NoDb サンプルを次のように微調整するだけです。

    // configure to use the model library for Angular
    breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);

    var TodoList = function () {
        this.title = "My todos";            
        this.todoListId = null; //explicitly define key prop
    };

ありがとうございました

4

1 に答える 1

0

簡単な答え: 主キーを0null ではなく に初期化します。

長い答え

あなたの再現アドバイスに従いましたが、あなたが言ったようにエラーが発生しました。Breeze は、ファイルを保存した後に主キーを修正する方法がわからない、と不満を漏らしましたTodoList

コンストラクターでTodoList主キーをに設定しているため、これは完全に予想されます。は有効な主キー値ではありませんnullnull

たまたま、キーはストアで生成されているため、サーバーは新しいものを保存TodoListし、db によって割り当てられた主キーの値と共にそれを返しました。Breeze はキーが変更されたことを確認し、 this への他の潜在的なエンティティ参照を修正したいと考えていますTodoList。保存前の値を持つエンティティを探します。nullしかし、値を検索する準備ができていません。

ここに Breeze バグがあります。null主キーとして割り当てさせてはいけません。そのバグを報告し、すぐに修正します。

0その間、代わりに値を使用しても問題ないはずですnull

重要:値を使用する必要があります0。他の整数はありません!キーがストアで生成された場合、型のデフォルト (0整数型のデフォルト) は Breeze にとって特別な意味を持ちます。Breeze に「作成ごとに、このキーを新しい一時的なキー値、つまりこのエンティティを保存するまでのプレースホルダーに置き換えます」と伝えます。

しかし、null0 以外の整数 (たとえば1) に設定すると、Breeze はキーをこの特定の値に初期化する必要があると想定します。したがって、TodoList作成するすべてのエンティティにはid=1. それは最初の作成でうまくいくかもしれません。id の衝突が発生するため、2 番目のものではありません (同じマネージャー内の同じタイプの 2 つのエンティティが同じキーを持つことはできません)。

を使用します0。これが明確であることを願っています。

ところで、「NoDb」サンプルは Knockout を使用しています。Angularを使用していることに気づきました。その違いは問題ではないと思います。問題の性質は同じでなければなりません。それが重要かどうか教えてくれると思います。

クライアントでメタデータを定義していますか?

「NoDb」サンプルがそうであり、主キー列の定義方法が非常に正確であるため、私は尋ねます:

関数 addTodoListType(store) {
    store.addEntityType({
        shortName: "TodoList",
        名前空間: "NoDb.Models",
        autoGeneratedKeyType: AutoGeneratedKeyType.Identity,
        データプロパティ: {
            todoListId: { dataType: DataType.Int32, isNullable: false, isPartOfKey: true },
            タイトル: { dataType: DataType.String, maxLength: 30, isNullable: false }
        }、
        ナビゲーション プロパティ: {
            // TodoItems のコレクションを返します -- TodoItem.TodoList に関連付けます
            todos: { entityTypeName: "TodoItem", isScalar: false, associationName: "TodoList_Items" }
        }
    });

それに注意してください

  • todoListIdと言ってキーとして識別しますisPartOfKey: true

  • このタイプのキーがストア生成であることを Breeze に伝えます。autoGeneratedKeyType: AutoGeneratedKeyType.Identity

上記の私の発言は、モデル ライブラリに Knockout ではなく Angular を使用している場合でも、アプリケーションがこれらの点で「NoDb」に似ていることを前提としています。

于 2013-06-05T02:24:00.250 に答える