我的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
答案 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 })