Entity Framework:table 中的字段指向同一 table 中的 ID(ParentID)

Entity Framework: field in table pointing to ID in same table (ParentID)

我有以下型号的请求 table:

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 必须通过 Label_ID 和 ID(复合键)

指向另一个请求

创建新的添加迁移后出现以下错误:

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

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

有什么帮助吗?

此致,珍诺

你可以用多个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; }

但这抛出

The configured column orders for the table 'Requests' contains duplicates. Ensure the specified column order values are distinct.

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

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 })