Linq加入了很多对很多人

时间:2017-09-24 20:19:29

标签: c# asp.net-mvc entity-framework linq

我使用的是MVC,C#和EntityFramework。

我已经在很多对很多人的加入中看到了不同的解决方案,经过大量的修修补补后,我让它在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只包含Recipe和Items但没有RecipeItems。实体框架在没有我的情况下处理这个问题。

我试图在没有任何运气的情况下制作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; }
  }

食谱中的ItemId用于设置配方将生成的实际项目。

1 个答案:

答案 0 :(得分:0)

尝试将此添加到您的食谱对象:

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

这会覆盖类的默认构造函数,并为EF提供初始化相关对象的位置。