4

そよ風を介して新しい子オブジェクトを保存しようとすると問題が発生します。私のモデルはこれに要約されます

親 Foo には、タイプ bar の 0 個以上の子オブジェクトがあります。つまり、親には、bars と呼ばれるタイプ ICollection のプロパティがあり、Bar オブジェクトには、タイプ Foo のプロパティ - その親があります。

Breeze を介して「親」Foo オブジェクトの新しいインスタンスをフェッチ、更新、および挿入できます。これは Web API コントローラーを使用していますが、Bar の新しいインスタンスを作成し、その親 Foo (既にキャッシュにある) を設定すると、制約違反が発生します。変更の保存を呼び出す

これに似たコードがあります

var newBar = entityManager.createEntity("Bar");
newBar.Foo = existingFoo;
entityManager.saveChanges();

また、既存のFoo.bars.push(newBar);などの親コレクションに子を追加しようとしました。


そして、 entityManager.addEntity(newBar)を明示的に呼び出します。

変更の保存を呼び出す前ですが、エラーは同じです

コントローラーに渡された JObject saveBundle を調べると、新しい子バー オブジェクトは表示されますが、親オブジェクトへの参照は表示されません。

これは単純な 1 対多の関係であり、サポートされていると思いますか? - 正しいように見えるメタデータの関係を確認できます

例外メッセージは次のようになります

「FooBarContext.Bars」のエンティティは、「Foo_Bars」関係に参加します。0 件の関連する 'Foo_Bar_Source' が見つかりました。

私は何を間違っていますか?

更新 1: コントローラーによって生成されたメタデータ:

"{\"schema\":{\"namespace\":\"BreezePlayground.Models\",\"alias\":\"Self\",\"d4p1:UseStrongSpatialTypes\":\"false\",\ "xmlns:d4p1\":\" http://schemas.microsoft.com/ado/2009/02/edm/annotation \",\"xmlns\":\" http://schemas.microsoft.com/ado /2009/11/edm\",\"cSpaceOSpaceMapping\":\"[[\\"BreezePlayground.Models.Foo\\",\\"BreezePlayground.Models.Foo\\"],[\\"BreezePlayground.Models.Bar\\" ,\\"BreezePlayground.Models.Bar\\"]]\",\"entityType\":[{\"name\":\"Foo\",\"key\":{\"propertyRef\": {\"name\":\"Id\"}},\"property\":[{\"name\":\"Id\",\"type\":\"Edm.Int32\",\ "nullable\":\"false\",\"d4p1:StoreGeneratedPattern\":\"Identity\"},{\"name\":\"Name\",\"type\":\"Edm.String \",\"fixedLength\":\"false\",\"maxLength\":\"最大\",\"unicode\":\"true\",\"nullable\":\"true\" }]、\"navigationProperty\":{\"name\":\"Children\",\"relationship\":\"Self.Bar_Parent\",\"fromRole\":\"Bar_Parent_Target\",\"toRole\" :\"Bar_Parent_Source\"}},{\"name\":\"Bar\",\"key\":{\"propertyRef\":{\"name\":\"Id\"}}, \"property\":[{\"name\":\"Id\",\"type\":\"Edm.Int32\",\"nullable\":\"false\",\"d4p1: StoreGeneratedPattern\":\"Identity\"},{\"name\":\"Description\",\"type\":\"Edm.String\",\"fixedLength\":\"false\", \"maxLength\":\"Max\",\"unicode\":\"true\",\"nullable\":\"true\"}],\"navigationProperty\":{\"name\":\"Parent\",\"relationship\":\"Self.Bar_Parent\",\"fromRole\":\"Bar_Parent_Source\",\"toRole\":\ "Bar_Parent_Target\"}}],\"association\":{\"name\":\"Bar_Parent\",\"end\":[{\"role\":\"Bar_Parent_Source\",\"type \":\"Edm.Self.Bar\",\"多重度\":\"*\"},{\"role\":\"Bar_Parent_Target\",\"type\":\"Edm.Self .Foo\",\"多重度\":\"0..1\"}]},\"entityContainer\":{\"name\":\"FooBarContext\",\"entitySet\":[{ \"name\":\"Foos\",\"entityType\":\"Self.Foo\"},{\"name\":\"Bars\",\"entityType\":\"Self.Bar\"}],\"associationSet\":{\"name\":\"Bar_Parent\",\"association\":\"Self.Bar_Parent\",\"end \":[{\"role\":\"Bar_Parent_Source\",\"entitySet\":\"Bars\"},{\"role\":\"Bar_Parent_Target\",\"entitySet\":\ "Foos\"}]}}}}"

サンプルコード:

 var managerInsert = new breeze.EntityManager("/api/FooBar");
    managerInsert.fetchMetadata().then(function () {
        managerInsert.fetchEntityByKey('Foo', 1, false)
        .then(function (data) {
            var child = managerInsert.createEntity('Bar');
            child.Parent(data.entity);
            child.Description("bar desc");
            managerInsert.saveChanges().then(function () {
                return true;
            })
                .fail(function () {
                    alert('save failed');
                });
        })
        .fail(function (data) {
            alert('fail');
        });
    });

生成されたリクエスト ペイロード:

{"entities":[{"Id":-1,"Description":"bar desc","entityAspect":{"entityTypeName":"Bar:#BreezePlayground.Models","entityState":"Added"," originalValuesMap":{},"autoGeneratedKey":{"propertyName":"Id","autoGeneratedKeyType":"Identity"}}}],"saveOptions":{"allowConcurrentSaves":false}}

子オブジェクトが挿入されましたが、外部キーが設定されていません

これはefマッピングと生成されたメタデータと関係があると思いますか?

更新 2: 外部キー プロパティが必要ですか?

コードを新しい Breeze SPA テンプレートの ToDo アプリ コードと比較すると、明らかに機能します。生成されたメタデータで見つけた主な違いは、ToDo アプリ モデルが親オブジェクトの外部キーを公開していることです。

私はそれを私の単純なFoo Barモデルに追加し、子オブジェクトの保存を機能させることができました-私の理解では、efはモデル内の外部キーを公開することをオプションにしていますが、Breezeが順番に必要であるようです正しいメタデータを生成するには? -どこかのドキュメントでそれを見逃しましたか?

4

1 に答える 1

4

よく釣れます!これをより適切に文書化する必要があり、この投稿の結果として、このトピックに関する文書を更新中です。

あなたが発見したように、そよ風は、「独立した関連付け」(EF用語で)の代わりに「外部キー関連付け」を使用していると想定しています。

この要件はバイパスできますが、機能が大幅に失われますが、クライアントに外部キーが存在することで、個別にクエリされる可能性のあるエンティティ間の関係を簡単に修正できるようになるためです。

詳細な背景については、次の MSDN 記事を参照してください

于 2013-03-05T01:14:29.897 に答える