实体框架错误:属性上的ForeignKeyAttribute无效

时间:2016-09-28 09:51:01

标签: c# entity-framework entity-framework-6

我收到错误,然后尝试将AgendaType添加到数据库上下文:

  

未处理的类型' System.InvalidOperationException'发生在EntityFramework.dll中   附加信息:属性' AgendaType'上的ForeignKeyAttribute在类型' MyDb.Agendum'无效。外键名称' FK_Agenda_AgendaType'未在依赖类型“MyDb.Agendum”上找到。 Name值应该是以逗号分隔的外键属性名称列表。

[Table("AgendaType")]
public partial class AgendaType
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public AgendaType()
    {
        Agenda = new HashSet<Agendum>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [StringLength(2)]
    [Index("IX_AgendaType_Code", 1, IsUnique = true)]
    public string Code { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Agendum> Agenda { get; set; }
}

public partial class Agendum
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int AgendaTypeId { get; set; }

    [ForeignKey("FK_Agenda_AgendaType")]
    public virtual AgendaType AgendaType { get; set; }
}

但是我在属性AgendaType上指定了外键,就像提供的数据库方案一样。什么是不正确的?

1 个答案:

答案 0 :(得分:1)

编辑:在OP的评论之后,我挖了一点。 根据{{​​3}},[ForeignKey]确实可以应用于导航属性或键属性,但不能同时应用于两者(提供的链接中的示例说明了用法)。如果外键的名称不同于约定,则只应使用该属性。请注意,这样做:

[ForeignKey("FK_Agenda_AgendaType")]
public virtual AgendaType AgendaType { get; set; }

然后int外键属性应为:

public int FK_Agenda_AgendaType { get;set; }

帖子的旧部分,留在这里记录讨论的历史:

您必须将[ForeignKey("FK_Agenda_AgendaType")]放在AgendaTypeId属性上,如下所示:

[ForeignKey("FK_Agenda_AgendaType")]
public int AgendaTypeId { get; set; }

编辑:似乎ForeignKey名称应该不同:

[ForeignKey("FK_AgendaType")]
public int AgendaTypeId { get; set; }