gpt4 book ai didi

javascript - "Only entities in this entityManager may be saved"当删除 Breeze 实体时订阅了entityChanged事件处理程序

转载 作者:行者123 更新时间:2023-11-28 08:04:04 24 4
gpt4 key购买 nike

我有一个用于多对多关系的映射表。我已经订阅了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 次:

  • AttachOnQuery(entityState 未更改)
  • PropertyChanged(导航属性 1 设置为 null,entityState 变为已删除
  • PropertyChanged(导航属性 2 设置为 null,entityState 已删除
  • PropertyChanged(导航属性 3 设置为 null,entityState 已删除
  • EntityStateChange
  • 分离(envityState 变为分离)

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com