Knockout.js 微风&x2B;图集合中的敲除绑定

Knockout.js 微风&x2B;图集合中的敲除绑定,knockout.js,breeze,Knockout.js,Breeze,我在使用Knockoutjs绑定保存Breezejs中现有数据图的更新时遇到问题 我从约翰·帕帕用热毛巾和杜兰达尔做的水疗开始 症状是,如果更新是医生的简单属性,我可以将更新保存到医生记录。但是,如果我在包含在医师中的一个集合中添加新元素,我可以保存该集合元素,但它会被保存到服务器,并保存到数据库中,但属性为空,并且不引用医师。我以Speciality为例,但我在医生记录中看到了与我添加项目的任何集合相同的行为。添加的项将出现在服务器上,所有属性都为空 医生图表在页面上显示良好,我能够在适当的地

我在使用Knockoutjs绑定保存Breezejs中现有数据图的更新时遇到问题

我从约翰·帕帕用热毛巾和杜兰达尔做的水疗开始

症状是,如果更新是医生的简单属性,我可以将更新保存到医生记录。但是,如果我在包含在医师中的一个集合中添加新元素,我可以保存该集合元素,但它会被保存到服务器,并保存到数据库中,但属性为空,并且不引用医师。我以Speciality为例,但我在医生记录中看到了与我添加项目的任何集合相同的行为。添加的项将出现在服务器上,所有属性都为空

医生图表在页面上显示良好,我能够在适当的地方将下拉列表与特定字段的适当值相关联。复选框等也会显示相应的值

下面是我正在使用的一段HTML:

<div id="physGraph" class="span10" data-bind="with: currentPhysician()[0]">
    <!-- more stuff here -->
    <div id="physSpecialties" class="span8">
      <span class="span8">Physician Specialties<i class="icon-plus-sign" title="Add new specialty to physician" data-bind="click: $parents[0].addSpecialtyToPhysician"></i></span>
      <div class="span8 table-bordered" data-bind="foreach: physicianSpecialties">
        <div class="span8">
          <span data-bind="text: specialty().name()"></span>
        </div>
        <div class="span7  table-bordered">
          <i class="icon-remove-sign" title="Remove specialty from physician list" data-bind="click: $parents[1].removeSpecialtyFromPhysician"></i>
          <select data-bind="options: $parents[1].specialties(), optionsText: 'name', value: specialty()"></select>
        </div>
      </div>
    </div>
    <!-- more stuff here -->
 </div> <!-- end with: currentPhysician()[0]
以下是我添加特色菜的方式:

  function addSpecialtyToPhysician(item, event) {
    var newItem = datacontext.createSpecialty();
    item.physicianSpecialties.push(newItem);
    // I've also tried it like this -- > currentPhysician()[0].physicianSpecialties.push(newItem);
  }
以下是我保存记录的方式:

  function save() {
    return datacontext.saveChanges();
  }
以下是这两项的codeFirst描述:

  public class Physician
  {
    public Physician()
    {
      PhysicianSpecialties = new List<PhysicianSpecialty>();
      PhysicianPayers = new List<PhysicianPayer>();
      IncentivePrograms = new List<PhysicianIncentiveDetail>();
      PhysicianNotes = new List<Note>();
      PhysInOrgs = new List<PhysInOrg>();
      Memberships = new List<Membership>();
    }
    public Int32 Id { get; set; }
    public Person ContactInfo { get; set; }
    public ICollection<Membership> Memberships { get; set; }
    public ICollection<PhysicianIncentiveDetail> IncentivePrograms { get; set; }
    public ICollection<PhysicianPayer> PhysicianPayers { get; set; }
    public ICollection<PhysicianSpecialty> PhysicianSpecialties { get; set; }
    public ICollection<Note> PhysicianNotes { get; set; }
    public ICollection<PhysInOrg> PhysInOrgs { get; set; }
    public string Dea { get; set; }
    public string Npi { get; set; }
    public string Tin { get; set; }
    public string Ssn { get; set; }
    public string TaxId { get; set; }
    public string MedLicenseNbr { get; set; }
    public string MedLicenseState { get; set; }
    public DateTime? MedLicenseRecertDate { get; set; }
    public EMRSystem EmrSystem { get; set; }
    public int ImportBatchId { get; set; }
    public bool IsPcp { get; set; }
    public bool SoloPractitioner { get; set; }
    public bool PartOfHospital { get; set; }
  }

  public class PhysicianSpecialty
  {
    public Int32 Id { get; set; }
    public Physician Physician { get; set; }
    public Specialty Specialty { get; set; }
    public bool IsPrimary { get; set; }
  }
我假设,通过将专业添加到医师图中,Breeze将自动从我将专业推送到CurrentMedical()上时出现的下拉列表中插入医师ID和所选专业[0]

有人能看到我遗漏了什么吗


谢谢

看起来您的数据正在部分保存,所以不确定这是否与您的问题有任何关系,但我遇到了热毛巾模板和breeze的问题。由于某些原因,即使在通过nuget更新之后,模板中的breeze源代码也非常不同。尝试从breejejs下载并替换源代码。如果它不起作用,你的境况也不会更糟。我早些时候发布了我的问题


这个答案来自沃德·贝尔。不用说,它奏效了,我得救了

这个问题被简化为医生记录中的一个集合:专科。我已将解决方案扩展到所有其他集合

EF模型

PhysicianSpeciality.cs类的定义如下:

public class PhysicianSpecialty
{
  public Int32 Id { get; set; }
  public Physician Physician { get; set; }
  public Specialty Specialty { get; set; }
  public bool IsPrimary { get; set; }
}
您缺少支持关联、医师和专科的外键(FK)。当您希望Breeze自动为您维护关联时,它需要FKs

此外,由于没有元数据来描述FKs,Breeze.NET不知道如何设置EF生成的医师Id和专科Id列

我这样重新定义了它,使用了公共和显式外键

public class PhysicianSpecialty
{
  public Int32 Id { get; set; }
  public Int32 PhysicianId { get; set; }
  public Int32 SpecialtyId { get; set; }
  public Physician Physician { get; set; }
  public Specialty Specialty { get; set; }
  public bool IsPrimary { get; set; }
}
当EF重建表时,它现在有PhysicianId和SpecialtyId列。我之所以选择这些名字,是因为我更喜欢带下划线的名字,而且它们恰好符合EF的惯例(有可能带下划线的名字也会这样;我不记得了)

现在,当您在BreezeJS客户机中分配关联时,这些FK属性将被设置,所有内容都将通过服务器

除了你还有两个问题。 组合框装订

details.js中的以下原始HTML行具有不正确的KO绑定:

  <select data-bind="options: $parent.specialties(), optionsText: 'name', value: specialty()"></select>

通过离线电子邮件查看此信息嗨,谢谢。我也注意到了这一点,并通过Nuget更新了Breeze,并升级到1.3.3。但问题依然存在。我已经招募了IdeaBrade来帮忙。找到解决方案后,我会发布。
public class PhysicianSpecialty
{
  public Int32 Id { get; set; }
  public Int32 PhysicianId { get; set; }
  public Int32 SpecialtyId { get; set; }
  public Physician Physician { get; set; }
  public Specialty Specialty { get; set; }
  public bool IsPrimary { get; set; }
}
  <select data-bind="options: $parent.specialties(), optionsText: 'name', value: specialty()"></select>
  <select data-bind="options: $parent.specialties, optionsText: 'name', value: specialty" />
  data-bind="foreach: phys().physicianSpecialties"