2017-03-08 65 views
0

我先使用代码,并有几个具有导航属性的类。更新与相同类型的关系的导航属性?

问题类别:

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

投诉类是工作的罚款。我遇到困难的地方是问题类别,它引用了子表ParentIssue。这个想法是,每个IsSubCategory == False的Issue记录可以有多个相关的Issue记录作为SubIssues的集合,每个IsSubCategory == true的Issue记录与ParentIssue的Issue记录具有1对1的关系。

因为一些DBA标准我还需要指定的外键字段的命名,即ParentIssueID而非Issue_ParentIssueID(或不管它自动一族)

我宁愿用数据说明这样做,但可能如果需要的话,使用OnModelCreating过程。

我该如何解决问题类以便创建正确的表?

回答

1

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

public int? ParentIssueID { get; set; } 

的映射,如果用流利的映射,应该是这样的:

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

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