1

外部キーと自己生成フィールドによって形成された複数列の主キーを使用して新しいオブジェクトを作成しようとしましたが、次のエラーが見つかりました。

マルチパートキーを持つエンティティのIDを自動生成することはできません。

今のところ、最も適切ではありませんが、キーを変更しますが、質問は次のとおりです。

すぐに自動生成されるマルチカラム主キーのサポートを計画していますか?

uservoiceにもリクエストを追加します。

挨拶。

ユースケースを説明するために編集します。

こんにちは、

確かに、外部キーと自己生成フィールドで構成される主キーを持つことは意味がない場合があります。

私のアイデアは、次のようなテーブルを作成することでした。

ParentID    ChildID             Data
1                  1            Some Data...
1                  2            Some Data...
2                  1            Some Data...
2                  2            Some Data...

最初のステップとして、次のようなテーブルを作成しました。

ParentID    ChildID             Data
1                  1            Some Data...
1                  2            Some Data...
2                  3            Some Data...
2                  4            Some Data...

ここで、ChildIDは自己生成フィールドでした。

だからあなたは私の質問を無視することができます。

挨拶。

4

3 に答える 3

2

私は同じ問題を抱えていましたが、Primary Key (PK)を変更せずに問題を解決しました。

私のPKには2つの列がありました

ProductId (ID)
TenantId (マルチテナント アプリケーション)

そのため、最初の問題は、新しいアイテムが に追加されたときに Breeze が新しいPKEntityManagerを生成できなかったことです。そして、カスタム エンティティ初期化関数を定義しました。

var manager = new breeze.EntityManager(breezeServiceUrl);
var store = manager.metadataStore;

function itemInitializer(item) {
   if (item.ProductId() == 0) {
      item.ProductId(/*Some counter value*/);
   }
   if (item.TenantId() == 0) {
      item.TenantId(TenantId);
   }

   if (item.isBeingEdited === undefined) {
      item.isBeingEdited = ko.observable(false);
   }
};

store.registerEntityTypeCtor("ProductItem", function() {/*Leave empty to use default constructor*/}, itemInitializer);

2 番目の問題は、Breeze がProductIdからの実際の値で を更新できなかったことです。これは、 PKEntityFrameworkによってエンティティを取得し、返された値が のみだったためです。したがって、関数をオーバーライドする必要があります。ProductId

var entityType = store.getEntityType("ProductItem");
var entityGroup = manager.findEntityGroup(entityType);

entityGroup._fixupKey = function (tempValue, realValue) {
   var ix = this._indexMap[tempValue + ":::" + TenantId]; //Changed line

   if (ix === undefined) {
      throw new Error("Internal Error in key fixup - unable to locate entity");
   }
   var entity = this._entities[ix];
   var keyPropName = entity.entityType.keyProperties[0].name;
   entity.setProperty(keyPropName, realValue);
   delete entity.entityAspect.hasTempKey;
   delete this._indexMap[tempValue];
   this._indexMap[realValue] = ix;
};

マルチパート キーについて他に質問がある場合は、ブログでお読みください。

于 2013-02-27T09:06:04.037 に答える
0

実際、キーの一部が自動生成されるマルチパート キーを持つことは、実際にはかなり一般的です。これは通常、主キーが外部キー プロパティと「自動生成された」シーケンス番号プロパティで構成されるレガシー データベースで発生します。通常、この自動生成されたキーはそれ自体ではグローバルに一意ではなく、外部キー プロパティと組み合わせてのみ使用されます。"OrderId, SequenceNumber" の外部キーを持つ orderDetail を考えてみてください。

主キーが複数の自動生成されたプロパティで構成されている場合は、それほど意味がないように思われます。

Breeze では、自動生成されたキーはグローバルに一意になるように意図されています。一方、上記のマルチパート キーでは、SequenceNumber はグローバルに一意ではありません (もしそうなら、それを単独で主キーにしない理由はありません)。

これは理にかなっていますか?

于 2012-12-11T20:50:24.457 に答える
0

この機能は現在ロードマップにはありませんが、この機能のユース ケースをよりよく理解したいと考えています。ご存知のように、Breeze は自動生成キーをサポートし、Breeze はマルチパート キーをサポートしていますが、両方を同時に使用するとどのようなシナリオが役立つと思いますか?

ありがとう!

于 2012-12-10T23:29:20.417 に答える