【问题标题】:EF: Unable to determine the principal end of an association between the typesEF:无法确定类型之间关联的主体端
【发布时间】:2015-01-19 16:48:24
【问题描述】:

无法确定类型之间关联的主体端。此关联的主体端必须使用关系流式 API 或数据注释显式配置。

型号:

`

[Table("Employees")]
public class Employee : Entity
{
    public string Name { get; set; }
    public int? AbsenceId { get; set; }
    [ForeignKey("AbsenceId")]
    public virtual Absence Absence { get; set; }
}

[Table("Absences")]
public class Absence : Entity
{
    public DateTime From { get; set; }
    public DateTime To { get; set; }
    public string Reason { get; set; }
    public int? SubstituteId { get; set; }
    [ForeignKey("SubstituteId")]
    public virtual Employee Substitute { get; set; }
}

`

员工缺勤,其员工可能与提及缺勤的员工不同。

这种情况有什么解决办法吗?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    嗯,首先.. 当您遵循实体框架约定时,您不需要指定 ForeignKey。按照惯例,EF 将重新识别您的 Navigation 属性称为 Foo 并且您的 ForeignKey 将称为 FooId 的事实。

    但是,真正的问题是您试图在两个实体之间创建 1:1 关联,而 EF 不支持这样的关联。

    EF 仅支持与共享主键的 1:1 关联,即两个表具有相同的主键,并且一个表的 PK 是另一个表的 PK 的 FK。

    如果您考虑一下,这是有道理的。 SQL 中不存在没有共享主键的原生 1:1 关系。如果将一个表中的 FK 添加到另一个表中,则会创建 1:Many。您可以通过在 FK 上创建唯一约束来模拟 1:1,但 EF 不支持约束。

    查看您的模型。你真的想要1:1吗?一个员工真的可以只有一次缺勤吗?曾经?可能不是。您可能希望 Absence 成为 1:Many。所以删除 AbsenceId 并将 Absence 更改为:

    public virtual List<Absence> Absences { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 2014-08-14
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多