Breeze 从多对多关系中的连接表中删除实体

Breeze 从多对多关系中的连接表中删除实体,breeze,Breeze,我与连接表有多对多关系 public class Contact { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<ContactContactGroup> ContactContactGroups { get; set; } } public class ContactContactGroup { public int

我与连接表有多对多关系

public class Contact
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<ContactContactGroup> ContactContactGroups { get; set; }
}

public class ContactContactGroup
{
    public int Id { get; set; }
    public int ContactId { get; set; }
    public int ContactGroupId { get; set; }

    public virtual Contact Contact { get; set; }
    public virtual ContactGroup ContactGroup { get; set; }
}

public class ContactGroup
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<ContactContactGroup> ContactContactGroups { get; set; }
}
这是我的删除功能:

   that.deleteMe = function (contactContactGroup) {    

       // Doesn't work also, duplicates entries after second deletion
       //contactGroup.ContactContactGroups.remove(contactContactGroup);

       contactContactGroup.entityAspect.setDeleted();
   };
以下是视图:

  <div data-bind="foreach: ContactContactGroups">
      <div data-bind="text: Contact().Name"></div>
      <button data-bind="click: deleteMe">Delete</button>
  </div>

删除
我从knockoutjs中找到了使用“with”绑定的解决方法:

   that.deleteMe = function (contactContactGroup) {    
       contactGroup.ContactContactGroups.remove(contactContactGroup);
       contactContactGroup.entityAspect.setDeleted();
   };

  <div data-bind="foreach: ContactContactGroups">
      <div data-bind="with: Contact">
          <div data-bind="text: Name"></div>
      </div>
      <button data-bind="click: deleteMe">Delete</button>
  </div>
that.deleteMe=函数(ContactGroup){
contactGroup.ContactGroups.remove(contactGroup);
ContactGroup.entityAspect.setDeleted();
};
删除
但我觉得这有点奇怪。
这是breezejs的错误还是我遗漏了什么?

错误是什么?Knockout需要绑定到一个对象,当您删除该对象的属性时,就会破坏绑定

如果您使用的是连接表,但在执行自定义保存之前仅“删除”了连接表的一侧,则听起来您似乎在逻辑中发现了问题。与其从contactGroup中删除contactGroup,不如在删除它之前将绑定的两侧都设置为null,这样视图(可能)就没有绑定到它的理由了

that.deleteMe = function (contactContactGroup) {

    contactContactGroup.Contact(null);
    contactContactGroup.ContactGroup(null);
    contactContactGroup.entityAspect.setDeleted();
    entityManager.saveChanges();
};
编辑

问题似乎是由于绑定的方法,您在视图中显示的是连接表,而不是两个属性之间的关系。问题仍然存在于Knockout中,无法显示已删除的绑定。一个更简捷的版本,你正在尝试做什么,将解决你遇到的问题

<div data-bind="foreach: ContactContactGroups">
    <div data-bind="text: $data.Contact().Name"></div>
    <button data-bind="click: deleteMe">Delete</button>
</div>

删除

当我调用函数“ContactGroup.entityAspect.setDeleted();”时,我得到上述异常。当我第一次从数组“contactGroup.ContactGroups.remove(contactGroup)”中删除关系实体时,不会引发异常,但如果我稍后调用rejectChanges函数,该实体将被复制。首先将属性设置为null,然后将其设置为deleted,然后我将更新答案。这也不起作用,当我将联系人设为null时,将引发异常。正如我所看到的,引用的属性无论如何都被setDeleted函数置为空,这让我很困惑。好吧,我明白你现在所说的,我肯定会对显示关系表的逻辑感到好奇,但问题总是你试图显示一些不存在的东西。在Breeze删除实体时,您可以做一些事情,让Knockout等待重新呈现视图sans name属性,但最终如果您想继续使用实体,则需要使用带绑定或prepend$data的。属性,使其可以为空,而不会使视图发疯。答案更新…你的“速记”版本似乎对我不起作用(我最终像OP一样使用了带有绑定的
),但你的答案帮助我了解了发生了什么,以及为什么它会异常。
<div data-bind="foreach: ContactContactGroups">
    <div data-bind="text: $data.Contact().Name"></div>
    <button data-bind="click: deleteMe">Delete</button>
</div>