【发布时间】:2014-09-10 15:38:29
【问题描述】:
我有一个 Breeze、Typescript、MVC 5.2、Knockout、Entity Framework webapp。当用户单击网格(kogrid)中的一行时,我尝试更新用户实体的值。该值(应该)保存在 entityChanged 事件处理程序中,但在 Fiddler 中我看到属性值没有更改,并且 entityAspect.entityState 设置为 Modified(!) originalValuesMap 具有旧的 TenantId 并且是唯一的值地图。
我像这样订阅实体更改事件:
this.EntityManager.entityChanged.subscribe((data: breeze.EntityChangedEventArgs) => {
if (data.entityAction == breeze.EntityAction.PropertyChange) {
return this.EntityManager.saveChanges(<breeze.Entity[]> new Array(data.entity))
.fail((error) => alert("Failed. " + error));}
});
数据正确到达事件处理程序。进行了 savechanges 调用,但更改的值 (tenantId) 没有更改。
rowclick 的事件处理程序如下:
ViewModel).OnRowClick = (tenantId: KnockoutObservable<System.IGuid>, viewModel: Imp.Scripts._TenantListViewModel) => {
entityManager.fetchEntityByKey("User", viewModel.Settings().CurrentUser().UserId(), false)
.then(entityKeyResult => {
(<Imp.Classes.UserBreeze>entityKeyResult.entity).CurrentTenantId(tenantId());
//entityManager.saveChanges(<breeze.Entity[]> new Array(entityKeyResult.entity));
})
.fail((error)=> alert("Error setting current tenant. " + error));});
当我禁用 entityChanged 订阅并启用注释行 entityManager.saveChanges.... 时,实体已正确保存。如果我取消注释该行,但保留订阅,它将不起作用。
如何在实体更改后自动保存更改的实体?
编辑: 解决方法是在更改当前用户的 CurrentTenantId 值之前暂时禁用 entityChanged 事件处理程序,手动保存实体并重新订阅 entityChanged 事件。 但是这个解决方案有味道。
【问题讨论】:
标签: entity-framework knockout.js typescript breeze kogrid