セットアップ
私は次のようにかなり単純な3つのクラスを設定しています。もちろん、他にもたくさんのプロパティがありますが、ここでは関係ありません。
モデル
public class Employee {
public int EmployeeId { get; set; }
public string UserName { get; set; }
public string Name { get; set; }
public ICollection<Position> Positions { get; set; }
}
public class Position {
public int PositionId { get; set; }
public int EmployeeId { get; set; }
[ForeignKey("EmployeeId")]
public Employee Employee { get; set; }
public int location { get; set; }
[ForeignKey("location")]
public Location Location { get; set; }
}
public class Location {
public int LocationId { get; set; }
public string Name { get; set; }
}
コントローラ
public ActionResult Index() {
string username = User.Identity.Name;
Employee emp = context.Employees.Include(e => e.Positions).FirstOrDefault(e => e.UserName == username);
return View(emp);
意見
@model Employee
<h1>Hi @Model.Name</h1>
<ul>
@foreach (var position in @Model.Positions) {
<li>@position.Name - @position.Location.Name</li>
}
</ul>
問題
ここで問題となるのは、遅延読み込みが原因です。呼び出しでNullReferenceExceptionが発生し@item.Location.Name
ます。位置をうまくロードしています(foreachのアイテム)。
インクルードを次のように変更してみました:
context.Employees.Include("Positions.Location").FirstOrDefault(e => e.UserName == username);
しかし、エラーが発生します。メタデータコレクション内の複数のアイテムがID「場所」に一致します。
Location
プロパティPosition
をに変更すると、次のPositionLocation
ようになります。System.Reflection.AmbiguousMatchException:あいまいな一致が見つかりました。
コントローラのコンテキストへの複数のクエリでロードするViewModelを使用する必要がありますか?それは維持するコードがもっとたくさんあるように思えます、そして私がそうする必要がなければ私はむしろしたくありません。