2

Breezeを使用して保存するSaveChanges()場合、必須フィールドがある場合に単純な更新を行うとエラーが発生します。

例えば

フィールドが不要なName, およびEmailフィールドを持つユーザーのテーブルがあります。Email

ユーザー名のリストを表示できます (ただし、電子メールは表示したくありません)。

表示は機能しますが、save が呼び出されません。JavaScript で検証エラーが発生します。

検証エラーのため保存されませんでした: 「メール」が必要です

しかし、確かに、これは私が変更したフィールドで単純な更新を生成するだけであり、電子メールで何もするべきではありません.

奇妙なことに、リストの最初の項目を変更しただけではエラーになりません。

何か案は?

HTML は次のようになります。

<a href="#" data-bind="click: save">Save</a>
<ul data-bind="foreach: modules">
<li >
    <form>
        <input type="checkbox" data-bind="checked: IsRunning" />
        <input type="text" data-bind="value: ModuleName, css: { done: IsRunning }" />
    </form>
  </li>
 </ul>

ビューモデルの保存部分は次のとおりです。

function saveChanges() {
    if (manager.hasChanges()) {
        manager.saveChanges()
            .then(saveSucceeded)
            .fail(saveFailed);
    } else {
        logger.info("Nothing to save");
    };
}
function saveSucceeded(saveResult) {
    logger.success("# of Modules saved = " + saveResult.entities.length);
    logger.log(saveResult);
}

function saveFailed(error) {
    var reason = error.message;
    var detail = error.detail;

    if (reason === "Validation error") {
        handleSaveValidationError(error);
        return;
    }
    if (detail && detail.ExceptionType.indexOf('OptimisticConcurrencyException') !== -1) {
        // Concurrency error 
        reason =
            "Another user, perhaps the server, may have deleted one or all of the todos.";
        manager.rejectChanges(); // DEMO ONLY: discard all pending changes
    }

    logger.error(error,
        "Failed to save changes. " + reason +
        " You may have to restart the app.");
};
function handleSaveValidationError(error) {
    var message = "Not saved due to validation error";
    try { // fish out the first error
        var firstErr = error.entitiesWithErrors[0].entityAspect.getValidationErrors()[0];
        message += ": " + firstErr.errorMessage;
    } catch (e) { /* eat it for now */ } 
    logger.error(message);
}
4

1 に答える 1

1

うーん...メールは必要ないとおっしゃっていますが、メタデータは必要だと考えています。このプロパティのメタデータを見て、これを確認できますか? コードは次のようになります。

var userType = myEntityManager.metadataStore.getEntityType("User");
var emailProp = userType.getProperty("email");
var isRequired = !emailProp.isNullable;

メタデータがフィールドが必須であると判断した場合、サーバーでこれに設定されている可能性があります。したがって、EF モデルを見て、[Required] 属性がこのプロパティに追加されていないことを確認してください。また、このフィールドがデータベースで null 不可かどうかを確認してください。

注意すべきもう 1 つの項目は、変更されたフィールドのみが実際に更新されるにもかかわらず、デフォルトでは、変更されたフィールドのみが変更された場合でも、保存前にサーバー上のエンティティ全体を検証しようとすることです。これは仕様によるものです。

ただし、entityManager の「validationOptions」を次のように設定することで、この動作を抑制することができます。

var vo = new breeze.ValidationOptions({ 
    validateOnSave: false,
    validateOnQuery: false, // not needed here but shown for completeness
    validateOnAttach: true  // not needed here but shown for completeness
});
myEntityManager.setProperties({ validationOptions: vo });
于 2012-12-21T18:18:46.547 に答える