我是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 :(得分:2)
问题在于EF对列表类型导航属性需要两件事:1)属性上的ICollection
类型和2)virtual
:
因此,如果您将Meals
属性更改为以下内容,那么您应该做得很好:
public virtual ICollection<Meal> Meals { get; set; }
ICollection
的原因是EF的返回值为IQueryable
类型。虚拟的原因是EF实际上返回代理类而不是实际的模型类。这些代理具有覆盖返回数据集的导航属性的覆盖。如果您的属性不是虚拟的,则EF无法覆盖它。