1

セットアップ

私は次のようにかなり単純な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を使用する必要がありますか?それは維持するコードがもっとたくさんあるように思えます、そして私がそうする必要がなければ私はむしろしたくありません。

4

1 に答える 1

0

ナビゲーションプロパティとその外部キーが大文字と小文字だけで異なる場合、EFはそれを好まないためです。モデルにANYWHEREが1つある場合、現在のリクエストでこのプロパティを参照していなくても、このエラーが発生します。

AmbiguousMatchExceptionが発生する例:

public int location {get;set;}
[ForeignKey("location")]
public Location Location {get;set;}

正常に機能する例:

public int locationid {get;set;}
[ForeignKey("locationid")]
public Location Location {get;set;}
于 2013-02-26T19:01:51.833 に答える