2

私は経費報告プロジェクトを作成しています-初めてMVCを使用します。

これはデータベースファーストプロジェクトであり、私はOracleODPを使用しています。

次のクラスのエンティティモデルがあります:ExpenseReport ExpenseItem ExpenseType

経費報告書には多くの経費項目が含まれます。
各経費項目は、そのExpenseTypeクラスのタイプのリストから特定の経費タイプになります。つまり、多対1の関係になります。

単一の経費タイプレコードには、タイプごとにカテゴリと、そのタイプに対応する説明/コメントフィールドの見出しが含まれます。

私の見解では、そのレポートのすべての経費項目のリストとともにレポートを表示することができます。これは、次のコードを使用して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ステートメントを変更してそこにプルすることはできませんか?または、entitymodelファイルを変更してこれらの値を取得できますか?読み込みの問題ですか?遅延読み込みをオフにしました。
  2. 仮想オブジェクトがgetに含まれるようにモデルレベルでこれを行う方法がない場合、上記のコードでキャストを設定して、その特定の経費タイプのExpenseTypeテーブルから値をプルするにはどうすればよいですか?

ありがとう。

4

1 に答える 1

0

確かに、あなたが何をしようとしているのかはわかりませんが、オブジェクトを一度にロードしたいだけのようです。これは、Include メソッドを使用して Entity Framework で行うことができます。

データベースセットの命名に「複数化」機能を使用していると思いますが、「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 に答える