2

我正在创建一个费用报告项目——我第一次使用 MVC。

这是一个 Database First 项目,我正在使用 Oracle ODP。

我有一个具有以下类的实体模型: ExpenseReport ExpenseItem ExpenseType

费用报告将包含许多费用项目。
每个费用项目都将属于该 ExpenseType 类中的类型列表中的特定费用类型 - 因此是多对一的关系。

单个费用类型记录包含每种类型的类别,以及与该类型一起使用的描述/评论字段的标题。

在我看来,我能够显示该报告以及该报告的所有费用项目的列表。我正在使用以下代码通过我的 Edit 或 Details 控制器执行此操作:

public ActionResult Details(long id)
{
   using (var db = new Entities())
   {
      var thisReport = db.ExpenseReport.Find(id);
      thisReport.expItems = db.ExpenseItem.Where(e => e.BB_EXPREPORT_ID == id).ToList();
      return View(thisReport);
   }
}

我尝试将其添加到代码中(就在返回视图行上方)以还包括每种类型的费用类型值(类别、标题),但由于转换问题而失败 - 无法隐式转换(您是否缺少转换? )

foreach (ExpenseItem item in thisReport.expItems)
{
  item.expType = db.ExpenseType.Where(e => e.BB_EXP_TYPE == item.BB_EXP_TYPE);
}

我的问题:

  1. 有没有办法可以设置我的模型类,这样我就不需要添加这些语句?IE 我不能修改虚拟对象 Get 语句以将它们拉到那里吗?或者我可以修改实体模型文件来获取这些值吗?是加载问题吗?我关闭了延迟加载。
  2. 如果没有办法在模型级别执行此操作以便将虚拟对象包含在 get 中,那么我如何在上面的代码中设置强制转换以从 ExpenseType 表中提取该给定费用类型的值?

谢谢。

4

1 回答 1

0

诚然,我不确定您要做什么,但看起来您只想一次加载所有对象。您可以使用 Entity Framework 使用 Include 方法来执行此操作。

我假设您正在使用“复数”功能来命名您的数据库集,但话又说回来,您对“db.ExpenseReport”的调用最后缺少一个(s)。

public ActionResult Details(long id) {
 using (var db = new Entities()) {
  ExpenseReport thisReport = db.ExpenseReport.Include("ExpenseItems.ExpenseType").Single(id);

  return View(thisReport);
 }
}

然后你可以像这样在 Razor 视图中使用它。

<ul>
 foreach (var item in Model.ExpenseItems) {
  <li>Name: @item.YourExpenseItemName - Type: @item.ExpenseType.YourTypeName</li>
 }
</ul>
于 2012-07-04T00:39:20.577 回答