1

我正在使用Entity Framework 4.1 code first如何通過實體框架中的對象的子對象循環4.1代碼優先

這裏是我Category類:

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool IsActive { get; set; } 
    public int? ParentCategoryId { get; set; } 
    public virtual Category ParentCategory { get; set; } 
    public virtual ICollection<Category> ChildCategories { get; set; } 
} 

上面的類是自引用類,例如,一個父類可以有子類別的列表。

我想創建父類別名稱和子類別名稱的字符串值,例如Parent Category 1 > Child Category 1-1

因此,我得到所有父類別的列表,循環通過每個父類別。而對於每一個父類我想通過子類別列表循環和每個孩子類別的名稱結合起來,父類的名字,讓我有類似:

Animal > Lion 
Anumal > Baboon 
Anumal > Zebra 
etc etc etc... 

這裏是我的循環代碼。如果有人能幫助我減少代碼行,那麼我會通過子類別想循環時,欣賞它:)

public IEnumerable<Category> GetParentChildCategories() 
{ 
    IEnumerable<Category> parentCategoryList = GetParentCategories() 
      .Where(x => x.IsActive); 
    List<Category> parentChildCategoryList = new List<Category>(); 

    foreach (Category parentCategory in parentCategoryList) 
    { 
      foreach (Category childCategory in parentCategory.ChildCategories) 
      { 
       if (childCategory.IsActive) 
       { 
        Category category = new Category 
        { 
         Id = childCategory.Id, 
         Name = parentCategory.Name + " > " + childCategory.Name 
        }; 
        parentChildCategoryList.Add(category); 
       } 
      } 
    } 

    return parentChildCategoryList; 
} 

它彈出在第二的foreach。這是爲什麼?這裏是錯誤:

已經有一個打開的DataReader與這個Command關聯,它必須先關閉。

+1

這裏解釋了它爲什麼會拋出異常:http://stackoverflow.com/questions/4867602/entity-framework-there-is-already-an-open-datareader-associated-with-this-comman/4868569#4868569 –

回答

3

EF打開了一個讀卡器,當你重複parentCategoryList。然後再次嘗試迭代parentCategory.ChildCategories時EF將打開一個Reader。由於有開放的閱讀器,它會引發錯誤。

你應該做的是急切地加載ChildCategories。這樣EF不必再次打開閱讀器。

所以你GetParentCategories()方法中,使用Include躍躍欲試負載他們

return db.Categories.Include(c => c.ChildCategories).Where(/* */); 
+0

@布倫丹它在'System.Data.Entity'命名空間中。您必須添加對「EntityFramework.dll」的引用。但是,如果您使用的是ObjectContext API,則可以使用Include(「ChildCategories」) – Eranga

1

連接字符串中添加

MultipleActiveResultSets=True 

0

如果你只是想結合是Parent->Child (Category Name)爲什麼不通過屬性和沒有必要的重活

歸還做partial班的Category班然後寫下面的property

public string MeAndMyParentCategory 
{ 
    get 
    { 
     //I assuming that your 
     // (Child's relation with the parent category called [Parent]) 
     if(this.Parent != null) 
     return string.Format("{0} > {1}", Parent.Name, this.Name); 
     return string.Empty 
    } 
} 
相關問題