2017-09-24 88 views
1

我正在使用MVC,C#和EntityFramework。Linq加入多對多

我在多對多的連接上看到了不同的解決方案,經過很多修補之後,我在Linqpad中使用了它。但是,當我在我的解決方案中嘗試它時,我得到一個錯誤,因爲其中一個表不在我的DBContext中。

我有兩個可見的表,一個隱藏。項目,食譜& RecipeItems。

所有食譜都基於一個項目,並使用兩個或更多的項目。 所以我想要一個列表,IEnumerable或類似的數據來自兩個項目和食譜,指定這個配方,然後我想要所有項目所需的配方。

下面的查詢工作在LinqPad

var t = from r in Recipes 
join i in Items on r.ItemId equals i.Id 
select new {FinalProduct = r.FinalProduct, Effect= i.Effect, 
Description = r.Description, Ingredients = r.RecipeItems.Select(g => g.Item)}; 

當我做這在我的解決方案,我得到的錯誤,因爲我的DbContext只包含配方和物品,但沒有RecipeItems。我猜,Entityframework可以處理這個問題。

我試圖做一個DbSet<RecipeItems>沒有任何運氣。你們誰有什麼我可以前進的建議。

項目類

public class Item 
    { 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Effect { get; set; } 
    public bool Published { get; set; } 

    public virtual ICollection<Recipe> Recipe { get; set; } 
    } 

食譜類

public class Recipe 
    { 
    [Key] 
    public int Id { get; set; } 
    public int ItemId { get; set; } 

    [Display(Name = "Final Product")] 
    public string FinalProduct { get; set; } 
    public string Description { get; set; } 
    public RecipeGroup RecipeGroup { get; set; } 
    public bool Published { get; set; } 

    public virtual ICollection<Item> Ingredients { get; set; } 
    } 

的項目Id的配方是設置實際商品的菜餚會令。

+0

好吧,你必須將ReceipeItems帶入上下文。但是,您已經介紹了「Items」和「Recipes」,您必須對「RecipeItems」執行相同的操作。 – user12345

+0

@ user12345否,EF可以處理隱藏的聯結表。 –

+1

請顯示課程,「項目」,「食譜」。你有什麼導航屬性?另外,你如何區分「基本」項目和其他項目? –

回答

0

嘗試添加該到你的食譜對象:

public Recipe() 
{ 
     this.Ingredients = new HashSet<Item>(); 
} 

這將覆蓋類的默認構造函數和那種給人EF初始化相關的對象的地方。