实体框架:表中的字段指向同一个表中的ID(ParentID)

时间:2015-10-08 16:26:50

标签: entity-framework foreign-keys migration

我的Request表有以下模型:

public class Request
    {
        [Key]
        [Column(Order = 0)]
        public int Label_ID { get; set; }
        [Key]
        [Column(Order = 2)]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        public DateTime Date { get; set; }
        public string Description { get; set; }
        public string Memo { get; set; }

        public DateTime DeadLine { get; set; }

        **[ForeignKey("Label_ID, ID")]
        [InverseProperty("Request")]
        public int Parent_ID { get; set; }
        public virtual Request Parent { get; set; }**


        [ForeignKey("Label_ID")]
        public virtual Label Label { get; set; }

        [ForeignKey("RequestFrom")]
        public int RequestFrom_UserID { get; set; }
        public virtual ApplicationUser RequestFrom { get; set; }

        [ForeignKey("RequestTo")]
        public int RequestTo_UserID { get; set; }
        public virtual ApplicationUser RequestTo { get; set; }

        [ForeignKey("RequestAbout")]
        public int? RequestAbout_UserID { get; set; }
        public virtual ApplicationUser RequestAbout { get; set; }

        public int? Project_ID { get; set; }
        [ForeignKey("Label_ID, Project_ID")]
        public virtual Project Project { get; set; }
    }
}

Parent_ID必须指向另一个Request by Label_ID和ID(复合键)

创建新的添加迁移后,我收到以下错误:

类型为“iMaSys.Models.Request”的属性“Parent_ID”上的ForeignKeyAttribute无效。在依赖类型“iMaSys.Models.Request”上找不到导航属性“Label_ID,ID”。 Name值应该是有效的导航属性名称。

我知道如何成功指向其他表,如RequestAbout_UserID中所示。迁移是成功的。只有在添加Parent_ID之后,我似乎无法解决此错误。

任何帮助?

最好的问候,Janno

1 个答案:

答案 0 :(得分:0)

您可以使用多个ForeignKeyAttribute来引用一个父级,但您还应该使用ColumnAttribute来指示关键部分的列顺序。但是你在这里有一个自动引用,所以有一个小问题。通过数据注释执行此操作的标准方法是:

public class Request
{
    [Key]
    [ForeignKey("Parent")]
    [Column(Order = 0)]
    public int Label_ID { get; set; }
    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [ForeignKey("Parent")]
    [Column(Order = 1)] // to refer to ID
    public int Parent_ID { get; set; }

    public virtual Request Parent { get; set; }

但这会抛出

  

表格'请求'已配置的列顺序包含重复项。确保指定的列顺序值是不同的。

您可以通过更改列索引来解决此问题:

public class Request
{
    [Key]
    [ForeignKey("Parent")]
    [Column(Order = 0)]
    public int Label_ID { get; set; }
    [Key]
    [Column(Order = 2)] // Changed
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [ForeignKey("Parent")]
    [Column(Order = 1)]
    public int Parent_ID { get; set; }

    public virtual Request Parent { get; set; }

EF接受了它。绝对列索引并不重要,相对顺序是重要的。

仍然......我不喜欢第1列引用第2列的有些模糊的功能。代码并不能解释自己。我更喜欢流利的映射:

modelBuilder.Entity<Request>()
    .HasRequired(p => p.Parent)
    .WithMany()
    .HasForeignKey(p => new { p.Label_ID, p.Parent_ID })