我有一个在客户端上使用 durandal、knockout.js 和微风的 ASP.NET MVC 应用程序。我有一个反复遇到的问题,但我在任何地方都没有找到任何提及。不确定我是否让自己陷入了独特的境地,或者我只是没有寻找正确的方法。
我需要知道如何从 observableArray 中删除 Breeze 实体,以便提交成功(参见下面的选项 A)并且 UI 反映更改(参见下面的选项 B)。
我有以下型号(缩写):
public class Donor
{
[Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual IList<Contact> Contacts { get; set; }
}
public class Contact
{
[Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("Donor")]
public int? DonorId { get; set; }
public virutal Donor Donor { get; set; }
}
我正在尝试从我的捐赠者中删除联系人。我很难在 Breeze 和 Knockout 之间获得正确的流程,因此该项目既可以从observableArray
(带有通知)中删除,也可以通过 Breeze 删除。
这是我尝试过的(javascript):
选项 A:
function deleteContact(contact){
viewModel.donor().contacts.remove(contact);
contact.entityAspect.setDeleted();
viewModel.uow.commit();
}
当我使用这种方法时,我从 Breeze.WebApi 收到以下错误:
Int32Converter 无法从 System.Int64 转换
我查看了堆栈,并检查了 Breeze 源代码(尽管我还没有配置解决方案来逐步完成它),错误来自 Breeze.WebApi.EFContextProvider::RestoreOriginal,它正在恢复原始属性对象的值。我不知道为什么它认为我的值是 Int64,但我找不到一个好的解决方法,所以我尝试了......
选项 B:
function deleteContact(contact){
contact.entityAspect.setDeleted();
viewModel.uow.commit();
}
这种方法允许我成功保存删除(因为该项目尚未手动从集合中删除,因此没有任何“原始值”)。但是,这里的问题是setDeleted
有效地从 observableArray 中删除了该项目,而没有通知我的敲除绑定该数组已更改。因此该项目已被删除并删除,但我的 UI 仍然显示该项目。未来的调用尝试donor().contacts.remove(contact)
都是徒劳的,因为 observableArray 不再拥有该项目。