2013-10-11 63 views
0

我有一個名爲ParentId的屬性的實體鏈接到名爲Parent的導航屬性。這種關係似乎工作正常,但我的問題是現在我想要另一個導航屬性,這將是一個「子」項目的父母是相同的實體ID列表。使用代碼優先將實體導航屬性映射到同一個表

我已經嘗試過我的FK屬性中的「ID」,「Parent」,但是我得到了「屬性'Children'上的'ForeignKeyAttribute'類型'jrSite.Core.SiteModel'無效」錯誤。

我如何告訴EF我希望該導航屬性在SiteModel表中搜索具有匹配父ID的項目?

我班低於

public class SiteModel 
{ 
    public SiteModel() { } 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public DateTime Created { get; set; } 

    [ForeignKey("Creator")] 
    public int CreatorID; 
    public SiteAccount Creator { get; set; } 

    [ForeignKey("Owner")] 
    public int OwnerID; 
    public SiteAccount Owner { get; set; } 

    [ForeignKey("Parent")] 
    public int? ParentID; 
    public SiteModel Parent { get; set; } 

    [ForeignKey("Parent")] 
    public List<SiteModel> Children { get; set; } 

    public SiteModel(SiteAccount creator, SiteAccount owner) 
    { 
     Creator = creator; 
     Owner = owner; 
     Created = DateTime.Now; 
    } 
} 
+0

你不需要這裏的構造:'public SiteModel(){}'。無論如何,它是默認的。 –

+0

哦,歡呼聲花花公子:) –

回答

0

ParentID/Parent導航屬性將照顧這種關係已經 - 擺脫ForeignKey的屬性聲明Children屬性。我只是測試了以下內容,它的工作原理如下:

public class HierarchicalEntity 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 

    public int? ParentId { get; set; } 
    public virtual HierarchicalEntity Parent { get; set; } 

    public virtual ICollection<HierarchicalEntity> Children { get; set; } 
} 


     using (var db = new TestEntities()) 
     { 
      var parent = new HierarchicalEntity(); 
      db.HierarchicalEntity.Add(parent); 

      var children = new List<HierarchicalEntity>() 
      { 
       new HierarchicalEntity() { Parent = parent }, 
       new HierarchicalEntity() { Parent = parent } 
      }; 

      children.ForEach(c => db.HierarchicalEntity.Add(c)); 

      db.SaveChanges(); 
     } 
+0

是的,似乎已經做到了,謝謝你的幫助我已經標記你的帖子作爲答案:) –

0

覆蓋OnModelCreating在你的DbContext類,並添加以下代碼:

modelBuilder.Entity<SiteModel>() 
    .HasRequired<SiteAccount>(s => s.Creator); 


modelBuilder.Entity<SiteModel>() 
    .HasRequired<SiteAccount>(s => s.Owner); 
相關問題