我首先使用代码,并且有几个类之间具有导航属性。
问题类:
public class Issue
{
public Issue()
{
Complaints = new List<Complaint>();
SubIssues = new List<Issue>();
}
[Key,ForeignKey("Complaints")]
public int IssueID { get; set; }
public string Name { get; set; }
public bool IsSubCategory { get; set; }
public virtual Issue ParentIssue { get; set; }
public virtual ICollection<Issue> SubIssues { get; set; }
public virtual ICollection<Complaint> Complaints { get; set; }
}
投诉类:
public class Complaint
{
public Complaint()
{
CreateDate = DateTime.Now;
}
public int ComplaintID { get; set; }
public DateTime CreateDate { get; set; }
[MaxLength(2000)]
public string Description { get; set; }
public bool IsClosed { get; set; }
[ForeignKey("IssueID")]
public virtual Issue Issue { get; set; }
public int IssueID { get; set; }
}
投诉类工作正常。我遇到困难的地方是问题类,它引用了 SubIssues 和 ParentIssue 的相同表格。我们的想法是,每个带有IsSubCategory == false的Issue记录可以将0到多个相关的Issue记录作为SubIssues的集合,并且每个带有IsSubCategory == true的Issue记录将与Issue记录作为ParentIssue具有1对1的关系。
由于某些DBA标准,我还需要指定外键字段的命名,即ParentIssueID而不是Issue_ParentIssueID(或其自动生成的任何内容)
我更愿意使用数据注释,但如果需要可以使用OnModelCreating过程。
如何修复问题类以便创建正确的表?
答案 0 :(得分:1)
IssueID
不能同时是主键和外键。您需要一个属性(和字段)ParentIssueId
。
public int? ParentIssueID { get; set; }
如果使用流畅的映射,映射应如下所示:
modelBuilder.Entity<Issue>()
.HasMany(i => i.SubIssues)
.WithOptional(i => i.ParentIssue)
.HasForeignKey(i => i.ParentIssueID);
ParentIssueID
是int?
,因为它是一种可选关系。