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 })
我有以下型号的请求 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 })