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] 属性是否未添加到此属性中。此外,检查该字段是否不可为空是数据库。

需要注意的另一项,默认情况下,微风将尝试在任何保存之前验证服务器上的整个实体,即使是那些未触及的字段,即使实际上只有修改过的字段会得到更新。这是设计使然。

但是,您可以通过设置 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 回答