0

我是MVC Noob,但我真的想获得一些使用MVC的经验,所以我尝试使用MVC重新创建一个Asp Classic项目。下面的代码不会显示膳食/索引页面上与菜单相关的膳食列表。在视图中显示模型

但是,我已经阅读了几种不同的模式,ninject和自动映射器,但是从我可以告诉它什么都没有,这是处理简单关联时所必需的。

我只想将菜单添加到菜单并汇总每个菜单的膳食价格。

型号:

public class Meal 
{ [Key] 
    public int MealId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public decimal Price { get; set; } 
    public int MenuId { get; set; } 
} 


public class Menu 
{ 
    [Key] 
    public int MenuId { get; set; } 
    public DateTime WeekendServed { get; set; } 
    public decimal Price { get; set; } 
    public List<Model> Meals { get; set; //Menus have meals. 
} 

菜单控制器:

public ViewResult Index() 
{ 
    return View(unitOfWork.MenuRepository.Get()); 
} 

Menu/Index/

@model IEnumerable<Skimos.Models.Meal> 
---- 

<Table Headers> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.WeekendServed) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Price) 
     </td> 
     <td> 
      @foreach (var meal in item.Meals) 
      { 
       @Html.Display(meal.Name) 
       @Html.Display(meal.Description) 
       @Html.Display(meal.Price.ToString()) 
      } 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.MenuId }) | 
      @Html.ActionLink("Details", "Details", new { id=item.MenuId }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.MenuId }) 
     </td> 
    </tr> 
} 

MenuRepository public IQueryable Menus { get { return context.Menus; } } 编辑:

+0

可以显示'unitOfWork.MenuRepository.Get()'的代码,以及强类型的视图是什么? – christiandev

+0

请勿围绕实体框架实施存储库/工作单元模式。 EF *已经*使用这种模式('DbContext'是你的UoW,你的'DbSet's是你的仓库)。如果你想抽象使用EF的逻辑(这是一个好主意),那么应该实现类似服务模式的东西。 –

+0

@ChrisPratt有关如何在EF中集成服务模式的任何链接? ,EF通过provind DBSet和DBContext为您提供了所有事情:如何更好地控制开发人员不允许将对象添加到某些数据集,而不允许在DBSet上执行某些操作? –

回答

2

问题是EF需要列表类型的导航性能两件事情:1)ICollection型和2)virtual的财产:

所以,如果您在Meals属性更改为以下内容,你应该是不错的:

public virtual ICollection<Meal> Meals { get; set; } 

其原因ICollection是,从EF返回值将是一个IQueryable类型。虚拟的原因是EF实际返回代理类而不是实际的模型类。这些代理会覆盖返回数据集的导航属性。如果您的财产不是虚拟的,EF无法覆盖它。

+0

我以前可能没有问过正确的问题。我甚至从来没有考虑尝试使用包含菜单的构造函数来对Meal类进行建模...此EF实现IoC吗?如果您能够提供关于我如何“解决/黑客”解决我遇到的问题的方法,我会很乐意选择您的答案。感谢收听。 – stink

+0

我不确定你在说什么。然而,你的“修复”是非常糟糕的设计。也就是说,'Menu'上有6个独立的'Menu'导航属性,6个不同的外键用于'Meal'。无论你是否只有6餐,这都是无关紧要的,因为这明显是M2M关系,应该这样建模。如果明天,你实际上需要7顿饭。现在你必须开放课程来添加另一个课程,并打破了开放式的原则。如果你发现自己在做'Something1,Something2,Something3,...'*你做错了*。 –

+0

我明白了,我从我的解决方案和此页面中删除了它。感谢您的输入。 – stink