更新与同一类型的关系的导航属性?

时间:2017-03-08 20:24:59

标签: entity-framework ef-code-first entity-framework-6

我首先使用代码,并且有几个类之间具有导航属性。

问题类:

 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过程。

如何修复问题类以便创建正确的表?

1 个答案:

答案 0 :(得分:1)

IssueID不能同时是主键和外键。您需要一个属性(和字段)ParentIssueId

public int? ParentIssueID { get; set; }

如果使用流畅的映射,映射应如下所示:

modelBuilder.Entity<Issue>()
            .HasMany(i => i.SubIssues)
            .WithOptional(i => i.ParentIssue)
            .HasForeignKey(i => i.ParentIssueID);

ParentIssueIDint?,因为它是一种可选关系。