0

我有两个实体 Fisioterapeuta 和 Paciente,一个 Fisioterapeuta 有 * Pacientes。当添加一个新的 Fisioterapeuta 时,就可以了。

在 Paciente 表单中,我有一个 DropDownList 来选择 Paciente 的 Fisioterapeuta,因此,实体 Paciente 具有 Fisioterapeuta 类型的属性。

当添加一名患者时,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

您可能正在重新创建Medicon insert (而不是为其分配以前建立的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,我有两种方法,如下所示:

不使用参照约束

在这种情况下,在 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”实体。避免它的一种方法是管理“f2”实体的状态,注意它是连接还是分离。

使用参照约束

在这种情况下,在 EDMX 中设计实体时,不要在工具框中选择关联,而是单击 EDMX 的空白区域,添加新关联,填写表格,不要忘记标记选项“将外键属性添加到” YourEntity 的实体”。这样,我的实体 Paciente 将具有 FisioterapeutaId 属性,它是 Fisioterapeuta 的外键,我可以编写这样的代码

        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 回答