Asp.net mvc 4 具有两个导航属性的延迟加载 设置

Asp.net mvc 4 具有两个导航属性的延迟加载 设置,asp.net-mvc-4,entity-framework-5,Asp.net Mvc 4,Entity Framework 5,我有一个相当简单的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; } } publ

我有一个相当简单的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; }
}
查看

@model Employee

<h1>Hi @Model.Name</h1>
<ul>
@foreach (var position in @Model.Positions) {
  <li>@position.Name - @position.Location.Name</li>
}
</ul>
但是我得到了一个错误:元数据集合中有多个项与标识“Location”匹配

如果我将
Position
上的
Location
属性更改为
PositionLocation
,则会得到:System.Reflection.AmbiguousMatchException:找到不明确的匹配


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

结果表明,这是因为当您有导航属性时,EF不喜欢它,并且它的外键只根据大小写不同。如果模型中的任何位置都有一个属性,即使在当前请求中未引用此属性,也会出现此错误

将导致含糊不清的MatchException的示例:

public int location {get;set;}
[ForeignKey("location")]
public Location Location {get;set;}
工作正常的示例:

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

我想知道您调用的Location类与Position类中使用的属性同名这一事实是否有问题。@Corylulu尝试将属性更改为“PositionLocation”,现在我得到了
System.Reflection.AmbiguousMatchException:找到了不明确的匹配。
您确定所有更改都正确吗?是否相应地更新了引用位置的所有实例?好像有什么遗漏了。也许可以编辑整个代码以反映任何新的更改。@Corylulu我仔细检查了一遍,它仍然给出了那个错误。
public int location {get;set;}
[ForeignKey("location")]
public Location Location {get;set;}
public int locationid {get;set;}
[ForeignKey("locationid")]
public Location Location {get;set;}