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);

但后来我得到了错误:元数据集合中的多个项目与身份“位置”匹配。

如果我将Location属性更改Position为,PositionLocation那么我得到:System.Reflection.AmbiguousMatchException: Ambiguous match found。

我是否应该使用一个 ViewModel 来加载多个查询到我的控制器中的上下文?这似乎需要维护更多的代码,如果我不需要,我宁愿不要。

4

1 回答 1

0

原来这是因为 EF 不喜欢它,当你有一个导航属性和它的外键只因大小写而不同时。如果您的模型中有一个 ANYWHERE,即使您在当前请求中没有引用此属性,您也会收到此错误。

将导致 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 回答