【问题标题】:Unable to determine a composite foreign key ordering for foreign key无法确定外键的复合外键排序
【发布时间】:2017-02-26 16:01:17
【问题描述】:

Person 是包含所有用户的用户模型。变更模型包括 EngineerId 和 ManagerId,两者都是 Person ID。为什么会出现此错误?

无法为 ProjectName.Models.Change 类型的外键确定复合外键排序。在复合外键属性上使用 ForeignKey 数据注释时,请确保使用 Column 数据注释或 fluent API 指定顺序。

public class Change
{
    [Key]
    public int ChangeId { get; set; }

    [Required(ErrorMessage = "Change description is required.")]
    [Display(Name = "Change Description")]
    [DataType(DataType.MultilineText)]
    public string ChangeDescription { get; set; }

    [Required(ErrorMessage = "Change date is required.")]
    [Display(Name = "Date of Change")]
    [DataType(DataType.Date)]
    public DateTime ChangeDate { get; set; }

    [Required(ErrorMessage = "Time is required.")]
    [Display(Name = "Time of Change")]
    [DataType(DataType.Time)]
    public DateTime ChangeTime { get; set; }

    [Required(ErrorMessage = "Engineer name is required.")]
    [Display(Name = "Engineer")]
    [ForeignKey("person")]
    public int EngineerId { get; set; }

    [Required(ErrorMessage = "Status is required.")]
    [Display(Name = "Status")]
    public int StatusId { get; set; }

    [Required(ErrorMessage = "Manager is required.")]
    [Display(Name = "Manager")]
    [ForeignKey("person")]
    public int ManagerId { get; set; }

    [Required(ErrorMessage = "System is required.")]
    [Display(Name = "System")]        
    public int SystemDetailId { get; set; }

    public virtual Person person { get; set; }
    public virtual Status status { get; set; }
    public virtual SystemDetail systemdetail { get; set; }
}

【问题讨论】:

  • @CodeCaster 我认为这里的问题有所不同 - OP 确实 想要复合 FK。你介意重新打开它吗?
  • @CodeCaster 是的,这就是我所指的[Key, Column(Order = index)]--谢谢
  • @Nathan McKaskle 请确认您不想要复合 FK,所以我可以重新提出问题。
  • 你不能称之为重复,我们在这里谈论的是 MVC 6,这是几年后的事了。另一个问题没有回答我的问题,据我所知,当时没有注释之类的东西。
  • 另见Entity Framework Code First - two Foreign Keys from same table,谷歌第一次点击“ef code first two foreign keys to the same table”。

标签: c# entity-framework


【解决方案1】:

您有 2 个外键属性(EngineerIdManagerId)已关联(通过 ForeignKey 属性)与一个且相同的导航属性 (person)。这样 EF 认为它们形成了一个复合键,因此您得到了例外。

由于(如果我理解正确)您的意图是建立 2 个关系,因此您需要将每个外键与单独的导航属性相关联。这是您需要更改的基本部分:

public class Change
{
    // ...

    [Required(ErrorMessage = "Engineer name is required.")]
    [Display(Name = "Engineer")]
    [ForeignKey("Engineer")]
    public int EngineerId { get; set; }

    [Required(ErrorMessage = "Manager is required.")]
    [Display(Name = "Manager")]
    [ForeignKey("Manager")]
    public int ManagerId { get; set; }

    // instead of person property:
    public virtual Person Engineer { get; set; }
    public virtual Person Manager { get; set; }
}

【讨论】:

  • 谢谢,这是我正在寻找的现代答案。
猜你喜欢
  • 2017-08-07
  • 2016-01-20
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多