- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用于多对多关系的映射表。我已经订阅了entityChanged 事件,并在处理程序中调用了saveChanged。当我单击 kogrid 行时,会调用单击事件处理程序,该事件处理程序会从 krid 和数据库中删除当前记录。
问题是我在 saveChanged 失败时收到“仅可以保存此实体管理器中的实体”消息,尽管该记录实际上已从数据库中删除。实体的接口(interface)定义如下:
export interface TenantMemberLinkBreeze extends breeze.Entity
{
TenantMemberId: KnockoutObservable<System.IGuid>;
MemberId: KnockoutObservable<System.IGuid>;
TenantId: KnockoutObservable<System.IGuid>;
InviterId: KnockoutObservable<System.IGuid>;
Status: KnockoutObservable<string>;
CreatedOn: KnockoutObservable<Date>;
Inviter: KnockoutObservable<User>;
Member: KnockoutObservable<User>;
Tenant: KnockoutObservable<Tenant>;
}
深入研究breece源代码,我发现在函数getEntitiesToSave中,有一个比较实体的entitymanager是否与函数参数em相同。这就是异常发生的地方。看起来实体已与上下文分离(e.entityAspect.entityManager 为 null)。 JavaScript 代码:
function getEntitiesToSave(em, entities) {
var entitiesToSave;
if (entities) {
entitiesToSave = entities.filter(function (e) {
if (e.entityAspect.entityManager !== em) {
throw new Error("Only entities in this entityManager may be saved");
}
return !e.entityAspect.entityState.isDetached();
});
} else {
entitiesToSave = em.getChanges();
}
return entitiesToSave;
}
entityChanged 的事件处理程序被触发 6 次:
entityChanged 事件处理程序 (TypeScript):
this.SubscriptionKey = this.BreezeEntityManager.entityChanged.subscribe((data: breeze.EntityChangedEventArgs) => {
if (data.entityAction === breeze.EntityAction.PropertyChange) {
return setTimeout(() => {
this.BreezeEntityManager.saveChanges(<breeze.Entity[]> new Array(data.entity))
.fail((error) => toastr.error("Failed. (more info: " + error + ")"));
}, 0);
}
});
触发删除的代码(事件处理程序)(TypeScript):
return this.BreezeEntityManager.fetchEntityByKey("TenantMemberLink", tenantMemberLinkId)
.then((data: breeze.EntityByKeyResult) =>
{
data.entity.entityAspect.setDeleted();
}
所以在我看来,在提交所有更改之前实体已分离,但我不知道再在哪里搜索。你有什么想法吗?
编辑:更改后问题就消失了:
this.BreezeEntityManager.saveChanges(<breeze.Entity[]> new Array(data.entity))
进入:
this.BreezeEntityManager.saveChanges()
这是一种解决方法,但我正在尝试理解这种(对我来说意想不到的)行为。
最佳答案
这可能是您的 setTimeout 调用的计时问题。您是否可能多次尝试“删除”同一实体?如果是这样,第一次删除将分离该实体,这将导致第二次删除失败并出现此错误。
当您在不带任何参数的情况下调用 saveChanges 时,问题就会消失,这一事实支持了这一假设,因为该调用仅尝试保存尚未保存的实体。
为了调试此问题,我将使用另一个函数包装失败的 saveChanges 调用,该函数在调用 Breeze 的 saveChanges 方法之前检查每个实体的状态并查看哪个实体/< em>entityAspect 有一个 null entityManager 属性。
关于javascript - "Only entities in this entityManager may be saved"当删除 Breeze 实体时订阅了entityChanged事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24997405/
我是一名优秀的程序员,十分优秀!