Breeze を使用して、エンティティの作成時に GUID キーを入力する最も簡単な方法は何ですか?
2 に答える
クライアントが新しいエンティティの Guid キーの設定を担当するようにエンティティが構成されていると仮定します。これは、Entity Framework Code First エンティティの Guid キーの既定値です。キープロパティが装飾されているかのようです[DatabaseGenerated(DatabaseGeneratedOption.None)]
明らかなアプローチは、エンティティを作成した後、マネージャーに追加する前にキーを設定することです。次に例を示します。
関数 createFoo() {
var foo = fooType.createEntity();
foo.id(そよ風.core.getUuid()); // ノックアウトの実装
manager.addEntity(foo);
}
これだけで十分かもしれません。
一方で、多くの場所で新しいFooを作成していて、何らかの奇妙な理由で関数を使用できないことに気付くかもしれませんcreateFoo。あなたは確かにそのコードを繰り返したくありません。
id-setting 動作を使用してエンティティ タイプを拡張するFooと、次のように記述できます。
関数 createFoo() {
var foo = fooType.createEntity(); // foo.id が設定されています
manager.addEntity(foo);
}
考慮すべき 2 つのアプローチがあります。カスタム コンストラクターと型初期化子です。どちらも「エンティティの拡張」で説明されています
コンストラクタ
カスタム コンストラクター内でキーを初期化できます。Breeze は、エンティティを作成するときとクエリされたエンティティを具体化するときの両方でコンストラクタを呼び出します。Breeze はマテリアライズ時に初期キー値を置き換えます。
Knockout モデル ライブラリを想定した例を次に示します。
関数 Foo() {
foo.id(そよ風.core.getUuid()); // KO を使用
}
// MetadataStore を取得する 1 つの方法
var ストア = manager.metadataStore;
// ctor を Foo 型で登録します
store.registerEntityTypeCtor("Foo", Foo);
ものすごく単純。唯一の欠点は、エンティティを作成するたびに Breeze が Guid を生成することです。これは、新しいエンティティを作成する場合でも、クエリからエンティティを生成する場合でも同じです。実体化中の無駄な努力ですが、それで何ですか?まあ、それはパフォーマンスの問題になるかもしれないと思いますが、測定するまではそうは思いませんでした.
初期化子
測定してみて、繰り返される Guid 生成が深刻な問題であるとします (本当に?)。代わりに型初期化子でキーを設定し、新しいエンティティを作成するときにのみ Guid ジェネレーターを呼び出すことができます。
Breeze は、エンティティが作成された後、またはクエリから実体化された後、そのエンティティをアプリケーションに返す直前に型初期化子を呼び出します。明らかに、データベースから実体化されたキーを上書きしたくないので、割り当てる前にキー値をテストして、それが実際のものではないことを確認します (つまり、作成されたエンティティを修正していることを確認します)。これが例です。
関数 fooInitializer(foo) {
var emptyGuid = "00000000-0000-0000-0000-000000000000";
if (foo.id() !=== emptyGuid) {
foo.id(そよ風.core.getUuid());
}
}
var ストア = manager.metadataStore;
// イニシャライザを登録します。この例ではアクターなし
store.registerEntityTypeCtor("Foo", function(){}, fooInitializer);
この例のように、すべてのエンティティに Guid 代理キーがあると仮定すると、非常に一般的なアプローチで次のことを行う createInstance ファクトリをコーディングできます。
function createInstance(breezeEntityManager, typeName) {
var keyProperty = breezeEntityManager.metadataStore.getEntityType(typeName, false).dataProperties.filter(function (p) {
return p.isPartOfKey;
})[0];
var config = {};
config[keyProperty.name] = breeze.core.getUuid();
return breezeEntityManager.createEntity(typeName, config);
}
この方法では、すべてのエンティティのイニシャライザを作成する必要はありません。