从多个关系中删除联结表中的实体

时间:2013-08-15 17:06:36

标签: 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 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; }
}

如果删除关系,我会收到以下异常:

Uncaught TypeError: Unable to parse bindings.
Bindings value: text: Contact().Name
Message: Cannot read property 'Name' of null

这是我的删除功能:

   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>

但这对我来说似乎有些奇怪。 这是一个breezejs bug还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

该错误是什么? Knockout需要绑定对象,当您删除该对象的属性时,您将破坏绑定。

如果您使用的是联结表,但只是在执行自定义保存之前“删除”了一侧,听起来您在逻辑中发现了问题。而不是从contactGroup中删除ContactContactGroup,为什么不在删除之前将绑定的两边都设置为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>