使用Breeze使用SaveChanges()
进行保存时,如果我有必填字段,则在进行简单更新时会出错。
E.g。
我有一个用户表,其中Name
和Email
字段不需要Email
字段。
我可以显示用户名列表(但不想显示电子邮件)。
显示有效,但保存永远不会被调用 - 我在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>
并且viewmodel保存部分位于:
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);
}
答案 0 :(得分:1)
嗯...你说电子邮件不是必需的,但元数据认为它是。您能通过查看此属性的元数据来确认吗?代码看起来像这样。
var userType = myEntityManager.metadataStore.getEntityType("User");
var emailProp = userType.getProperty("email");
var isRequired = !emailProp.isNullable;
如果元数据认为该字段是必需的,则可能在服务器上将其设置为此字段。因此,请查看您的EF模型,并检查[Required]属性是否尚未添加到此属性中。另外,检查此字段是否为不可存在的数据库。
另外一项需要注意的事项,默认情况下,breeze将尝试在任何保存之前验证服务器上的 整个 实体,甚至是那些未触及的字段,即使只有修改过的字段实际上会更新。这是设计的。
但是,您可以通过设置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 });