0

Knockoutjs バインディングを使用して、Breezejs の既存のデータ グラフへの更新を保存するのに問題があります。

HotTowel と Durandal を使用した John Papa の SPA から始めました。

症状は、更新が医師の単純なプロパティである場合、更新を医師レコードに保存できることです。ただし、医師に含まれるコレクションの1つに新しい要素を追加すると、コレクション要素を保存できますが、サーバーに送られ、データベースに保存されますが、プロパティはnullで、医師への参照はありません. 例として Specialty を使用していますが、アイテムを追加した Physician レコードのどのコレクションでも同じ動作が見られます。追加された項目は、すべてのプロパティが null でサーバーに送信されます。

医師のグラフはページにうまく表示され、ドロップダウンを適切な特定のフィールドの適切な値に関連付けることができます。チェックボックスなどにも適切な値が表示されます。

私が使用している 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]

私が医師を取得する方法は次のとおりです。

define([services/datacontext', 'viewmodels/physList'], function (datacontext, physListVm) {
  var initialized = false;
  var physNotes = ko.observableArray();
  var currentPhysician = ko.observable();
  var vm = {
    activate: activate,
    title: 'Physician Edit',
    currentPhysician: currentPhysician,
    addSpecialtyToPhysician: addSpecialtyToPhysician,
    save: save,
    // more code in here
  }

  // internal functions for physDetailEdit
   function activate() {
    initLookups();
    var physIdSelectedFromList = physListVm.selectedPhys().id();
    return getPhysicianDetail(physIdSelectedFromList);
  }

  function getPhysicianDetail(requestedPhysId) {
    var promise = datacontext.getPhysicianDetails(requestedPhysId, currentPhysician);
    return promise;
  }
  more code in here
}

スペシャリティを追加する方法は次のとおりです。

  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();
  }

これら 2 つの項目の 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; }
  }

保存すると得られるものは次のとおりです。

Id  IsPrimary   Physician_Id    Specialty_Id
21  0           NULL            NULL

専門分野を Physician グラフに追加することで、Breeze は自動的に医師 ID と、専門分野を currentPhysician()[0] にプッシュしたときにページに表示されるドロップダウンから選択した専門分野を挿入すると想定しています。

誰かが私が見逃しているものを見ることができますか?

ありがとう

4

2 に答える 2

0

データが部分的に保存されているように見えるので、これが問題と関係があるかどうかはわかりませんが、ホット タオル テンプレートとそよ風に問題がありました。何らかの理由で、nuget 経由で更新した後でも、テンプレートのそよ風のソースが大きく異なります。breejejs からダウンロードして、ソースを置き換えてみてください。それがうまくいかなくても、あなたはもっと悪いことではありません。以前に問題を投稿しました

EF で Breeze を使用する際のエラー

于 2013-05-15T03:05:00.667 に答える
0

この回答は Ward Bell からのものです。言うまでもなく効いて助かりました!

この問題は、医師の記録の 1 つのコレクションである Specialties に単純化されました。ソリューションを他のすべてのコレクションに拡張しました。

EFモデル

PhysicianSpecialty.cs クラスは次のように定義されています。

public class PhysicianSpecialty
{
  public Int32 Id { get; set; }
  public Physician Physician { get; set; }
  public Specialty Specialty { get; set; }
  public bool IsPrimary { get; set; }
}

関連付け、Physician および Specialty をサポートする外部キー (FK) がありません。Breeze に関連付けを自動的に維持させたい場合は、FK が必要です。

また、FK を記述するメタデータがないため、Breeze.NET は EF で生成された Physician_Id 列と Specialty_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 プロパティが設定され、すべてがサーバーに流れます。

他に2つの問題があることを除いて。コンボボックス KO バインディング

details.js の次の元の HTML 行には、正しくない KO バインディングがあります。

  <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"
于 2013-05-23T20:29:14.300 に答える