2

顧客を持つドメイン モデルがあり、1 つの住所 (1:1) と 1 つ以上の電話番号 (1:M) があります。顧客にはユーザー提供の PK (文字列) があり、住所と電話は ID 列 (サーバーによって生成された) を使用します。

「新規顧客の追加」画面で Breeze エンティティの作成を管理する方法を理解するのに苦労しています。画面上のフォームを使用すると、ユーザーは顧客、住所、および電話番号のデータを入力できます。

私はデュランダルとノックアウトを使用しているので、「customeradd.js」ビューモデルは次のようになります。

// -- snip ---
    var customer = ko.observable(),
        hasChanges = ko.computed(function () {
            return datacontext.hasChanges();
        });

    var vm = {
        hasChanges: hasChanges,
        customer: customer,
        activate: activate
    };

    return vm;

    function activate() {
        customer(datacontext.createCustomer());
    }
// -- snip ---

そして私の「/services/datacontext.js」:

// -- snip ---
    breeze.NamingConvention.camelCase.setAsDefault();

    var manager = new breeze.EntityManager(config.remoteServiceName);
    var hasChanges = ko.observable(false);

    manager.hasChangesChanged.subscribe(function (eventArgs) {
        hasChanges(eventArgs.hasChanges);
    });

    function createVehicle() {
        return manager.createEntity("Customer");
    }
// -- snip ---

私の質問は次のとおりです。

  • Customer を作成したら、アドレスと電話のリストを作成し、それを KO オブザーバブルにする前に Customer エンティティに追加する必要がありますか? または、これは createEntity() メソッドによって自動的に行われますか?
  • Id を指定せずに Customer を作成するにはどうすればよいですか? キーを null または '' に設定すると、Breeze は不平を言います (「エラー: 最初にキーを設定するか、entityType 'AutoGeneratedKeyType' プロパティを 'None' 以外に設定しないと、オブジェクトを EntityManager にアタッチできません」)。ただし、一時キーを生成すると (breeze.core.getUuid() などを使用して)、それが Id フォーム フィールドに表示され、エンド ユーザーに指定してもらいたいのですが...余分なフィールドでエンティティを拡張し、保存する前にスワッピングと検証を行うことに頼るには (私はこの考えがまったく好きではありません)? より良い方法はありますか?
  • フォームのボタンを有効/無効にするために、EntityManager に変更があるかどうかを追跡しています。ただし、エンティティが作成されるたびに、自動的に「追加」状態になるため、hasChanges は true になります。私が望むのは、ユーザーがフォームを編集した場合にのみ変更を取得することです (したがって、基になるエンティティに変更を加えます)。これにアプローチする最良の方法は何ですか?

ところで、エンティティのカスタム コンストラクターを登録するというこの推奨事項を見てきました (既に実装していますが、ユーザーに独自の ID を提供させ、ユーザーが編集した場合にのみエンティティに変更済みのフラグを付ける方法はまだ明確ではありません...)

4

2 に答える 2