0

私は 2 つのエンティティ Fisioterapeuta と Paciente を持っており、1 つの Fisioterapeuta は * Pacientes を持っています。新しいFisioterapeutaを追加すると、OKです。

Paciente フォームには、Paciente の Fisioterapeuta を選択するための DropDownList があるため、エンティティ Paciente にはタイプ Fisioterapeuta のプロパティがあります。

患者を 1 人追加すると、EF は Fisioterapeuta を複製 (別の患者を作成) します。

Paciente.Fisioterapeuta が != null であるため、これが発生することはわかっています。Paciente を保存しようとするときに汎用リポジトリを使用すると、Fisioterapeuta が一緒になります。

この動作を回避する方法はありますか? これをどのように処理しますか?

PS: 私は汎用リポジトリを使用しているため、SaveChanges をオーバーライドしたり、保存時に検証を行うことはできません。

編集1

@Brad Christieの提案に従って、私は次のことを行います:

Paciente p = (Paciente)grdEdicao.DataContext; //here the DataContext brings me the Fisioterapeuta on the property p.Fisioterapeuta

p.Fisioterapeuta = Repository<Fisioterapeuta>.GetByID((int)comboFisioterapeutas.SelectedValue); // i try to set the Fisioterapeuta getting it from the repository.

この変更は私の問題を解決しません。

編集2

テストするために github プロジェクトを作成しました。こちらはhttps://github.com/Ewerton/RelatedEntities_EFです。

4

2 に答える 2

0

Medic(以前に確立された を割り当てるのではなく) 挿入時にを再作成してMedicいる可能性があるため、EF は、挿入を満たすために新しいエントリを作成する必要があると考えています。

すでにデータベースにPatient.Medicある への参照を割り当てるときは、それを確認してください。Medic例えば

patient.Medic = Medics.SingleOrDefault(x => x.Name = medicName);

medicNameはドロップダウンから渡された値であると仮定します。別の方法 (そしておそらくより良い方法) は、メディックの ID を参照し、それを使用して参照をフェッチする必要があります。

だから、一緒に:

<label for="name">
  Patient Name:
  <input type="text" id="name" name="name" />
</label>
<label for="medic">
  Medic:
  <select id="medic" name="medic">
    <option value="">Please select one</option>
    <option value="1">Dr. Smith</option>
    <option value="2">Dr. Jones</option>
  </select>
</label>
<input type="submit" value="Save" />

それで:

Patient patient = new Patient {
  Name = name,
  Medic = Medics.SingleOrDefault(x => x.Id == medic)
};
于 2012-10-18T02:10:55.117 に答える
0

わかりました、私は自分の質問に答えます(私はこれをしたくありません)。

私は次の意見になりました.EFを使用している場合、次のように2つのアプローチがあります。

参照制約を使用しない

この場合、EDMX でエンティティを設計するときは、ツール ボックスから関連付けを選択し、親エンティティをクリックし、線を子エンティティにドラッグするだけで関連付けが作成されます。この方法では、おそらく注意が必要です。接続されたエンティティと切り離されたエンティティ(そして、私のように汎用リポジトリを使用している場合、私の質問で説明されているのと同じ問題で終了します)。このアプローチでは、次のようなコードを記述します。

        Fisioterapeuta f2 = new Fisioterapeuta();
        using (var ctx = new Model1Container())
        {
            f2 = ctx.Set<Fisioterapeuta>().FirstOrDefault();
        }

        Paciente p = new Paciente();
        p.Nome = "Paciente1";
        p.Fisioterapeuta = f2; // here you associate a Fisioterapeuta to a Paciente

「p」エンティティを保存しようとすると、「f2」エンティティもデータベースに作成されます。これを回避する 1 つの方法は、"f2" エンティティがアタッチされているか、デタッチされているかに注意して状態を管理することです。

参照制約の使用

この場合、EDMX でエンティティを設計するときは、ツール ボックスで関連付けを選択する代わりに、EDMX の空白の領域をクリックし、新しい関連付けを追加し、フォームに入力して、「外部キー プロパティを追加する」オプションをマークすることを忘れないでください。 YourEntity' エンティティ". このようにして、私のエンティティ Paciente は、Fisioterapeuta への外部キーである FisioterapeutaId プロパティを持ち、このようなコードを書くことができます。

        Fisioterapeuta f2 = new Fisioterapeuta();
        using (var ctx = new Model1Container())
        {
            f2 = ctx.Set<Fisioterapeuta>().FirstOrDefault();
        }

        Paciente p = new Paciente();
        p.Nome = "Paciente1";
        //HERE ARE THE TRICK. I MANAGE THE ID OF THE RELATED ENTITIE, I DONT LET THIS WORK FOR EF.
        p.FisioterapeutaId = f2.Id;

この方法では、「p」オブジェクトの FisioterapeutaId のみを設定することに注意してください。この場合、「p」オブジェクトを保存すると、Fisioterapeuta エンティティは再度作成されません。

結論

それを行う正しい方法はありません。自分で方法を選択する必要があります。

PS: GitHub のプロジェクトを更新しました。リンクはhttps://github.com/Ewerton/RelatedEntities_EFです。

于 2012-10-18T17:25:51.853 に答える