1

私は 3 つのそよ風のエンティティを持っています。私のアプリケーションは、保存のためにサーバーに行く前に一度に 3 つのテーブルすべてにレコードを追加する長い形式です。Drivers & Vehicles テーブルの 2 つには AutoLead との関係があり、クライアント側で一度に入力されている AutoLead テーブルからの AutoLeadId が必要です。

ユーザーが AutoLead に情報を入力し、1 つのシームレスなフォームで Drivers テーブルと Vehicles テーブルにレコードを追加するフォームがあります。最初に保存を分離せずにドライバーと車両に割り当てる ID を取得するにはどうすればよいですか。最初に AutoLead を保存し、新しい ID を返し、それをドライバーと車両に割り当ててから再度保存します。Vehicles と Drivers のナビゲーション プロパティの Id を生成するためだけに、サーバーに何度もアクセスすることを避けたいと考えています。

私が理解したことから、そよ風は、作成したクライアント側からの一時 ID を使用して、これらの ID を修正できるはずでした。しかし、保存しようとすると、これらの ID は変更されません。によると:http://www.breezejs.com/documentation/navigation-properties

ナビゲーション プロパティをオブジェクトで直接設定しようとすると、ナビゲーション プロパティの未定義エラーが発生します (以下のコードを参照)。別のアプローチを使用して、外部キーを ID に直接設定しようとすると、サーバー (一時 ID) に -1 をプッシュしようとするため、SQL から外部キー エラーが発生します。私は何か間違ったことをしているに違いないことを知っています。これが私のコードの一部です:

新しいクライアント側エンティティを作成します。

    // New entity creation functions
    var createAutoLead = function() {
        return manager.createEntity('AutoLead');
    };

    var createAutoLeadDriver = function () {
        return manager.createEntity('AutoLeadDriver');
    };

    var createAutoLeadVehicle = function () {
        return manager.createEntity('AutoLeadVehicle');
    };

    // Save Function Loop through all drivers and vehicles and set 
       their autoLeadId's before saving

    var saveAutoLead = function (newAutoLead, autoLeadDrivers, autoLeadVehicles) {

        // Loop through drivers and set the foreign keys
        for (var i = 0; i < autoLeadDrivers().length; i++) {
            autoLeadDrivers()[i].autoLead(newAutoLead);
        }

        // Loop through drivers and set the foreign keys
        for (var i2 = 0; i2 < autoLeadVehicles().length; i2++) {
            autoLeadVehicles()[i2].autoLead(newAutoLead);
        }

        manager.saveChanges()
            .then(saveSucceeded)
            .fail(saveFailed);

        function saveSucceeded() {
            return logger.log('Debug Message', 'Quote saved successfully', null, system.getModuleId(datacontext),
                    true, config.growlTypes.success);
        }

        return logger.log('Debug Message', 'Quote saved successfully', null, system.getModuleId(datacontext),true, config.growlTypes.success);
    };
4

2 に答える 2

0

あなたがそれを理解してくれてうれしいです。FK を設定しても同様に機能することを指摘したかっただけです。Northwind を使用した私のテストでは:

var em = newEm();

// acting as Vehicle
var ord = em.createEntity("Order");
ord.setProperty("orderDate", new Date());

// acting as Driver
var emp2 = em.createEntity("Employee");
emp2.setProperty("firstName", "Test fn2");
emp2.setProperty("lastName", "Test ln2");
emp2.setProperty("fullName", "foo2");

// acting as AutoLead
var emp1 = em.createEntity("Employee");
emp1.setProperty("firstName", "Test fn1");
emp1.setProperty("lastName", "Test ln1");
emp1.setProperty("fullName", "foo1");

次のように、emp1 を ord および emp2 に関連付けることができます。

ord.employeeID(emp1.employeeID());
emp2.reportsToEmployeeID(emp1.employeeID());

また

ord.employee(emp1);
emp2.manager(emp1);

どちらの場合も、FK は保存後に解決/更新されます。そうは言っても、FK を扱うのではなく、ナビゲーション プロパティを直接設定することをお勧めします。

于 2013-05-20T21:02:48.963 に答える
0

それを理解することができました。この問題を抱えている人は、ナビゲーション プロパティを直接設定する必要があります。外部キー自体を設定しないでください。修正は、ナビゲーション プロパティを関数としてプッシュすることだったので、以下は修正されたコードです。そよ風のエンティティがオブザーバブルにラップされていたため、最後に () を使用して関数として追加する必要がありました。

   // Save auto lead
    var saveAutoLead = function (newAutoLead, autoLeadDrivers, autoLeadVehicles, newAutoLeadDriver, newAutoLeadVehicle) {

        // Detach orphan entities
        manager.detachEntity(newAutoLeadDriver());
        manager.detachEntity(newAutoLeadVehicle());

        // Loop through drivers and set the foreign keys
        for (var i = 0; i < autoLeadDrivers().length; i++) {
            autoLeadDrivers()[i]().autoLead(newAutoLead());
        }

        // Loop through drivers and set the foreign keys
        for (var i = 0; i < autoLeadVehicles().length; i++) {
            autoLeadVehicles()[i].autoLead(newAutoLead());
        }

        manager.saveChanges()
            .then(saveSucceeded)
            .fail(saveFailed);

        function saveSucceeded() {
            return logger.log('Debug Message', 'Quote saved successfully', null, system.getModuleId(datacontext),
                    true, config.growlTypes.success);
        }

        return logger.log('Debug Message', 'Quote saved successfully', null, system.getModuleId(datacontext),true, config.growlTypes.success);
    };
于 2013-05-20T03:55:40.447 に答える