提问人:ExecChef 提问时间:3/10/2022 最后编辑:marc_sExecChef 更新时间:3/11/2022 访问量:1109
ASP.NET MVC 5 / C# Foreach 循环 - 重复相同的数据
ASP.NET MVC 5 / C# Foreach loop - repeats same data
问:
这似乎很“初学者”,但我正在挣扎。
我有一个 SQL Server 视图,它连接了两个表(和 )。我有一个视图的模型。Employee
Cars
当我打开 SQL Server Management Studio 并查询 SQL Server 视图时,其中包含与员工 A 匹配的记录。我得到两条记录,因为员工在表中列出一次,在表中列出两次。在 SQL Server Management Studio 中,我验证了上述人员的两者是否唯一。完全符合它应该的样子。Select *
Employee
Cars
Cars
但是我一定在我的代码中做错了什么,在 ASP.NET MVC 5 应用程序中,因为当我加载视图时,它应该显示两个唯一的记录 - 它,而不是向我显示完全相同的记录(同一辆车)两次。Index
在我的控制器中:
public ActionResult Index()
{
string MyName =
System.Security.Principal.WindowsIdentity.GetCurrent().Name;
String result = MyName.Substring(MyName.Length - 6);
ViewBag.WhoAmI = result;
UserPrincipal userPrincipal = UserPrincipal.Current;
String name = userPrincipal.DisplayName;
ViewBag.MyRealID = name;
try
{
Web_Parkinglot_Header_FullViewRepository oItem = new
Web_Parkinglot_Header_FullViewRepository();
Var item = oItem.GetbyLogon((string)result);
if (!String.IsNullOrEmpty(result))
{
}
return View(item.ToList());
}
catch (Exception ex)
{
throw ex;
}
}
存储 库:
public List<Web_Parkinglot_Header_FullView> GetbyLogon(string result)
{
return this.Context.Web_Parkinglot_Header_FullViews.Where(a => a.logon_id == result).ToList();
}
视图:
foreach (var item in Model)
{
<table class="table">
<tr>
<td>
<img src="~/Content/images/bmw.png" width="75" height="50" />
</td>
<td>
<b>Vehicle Make:</b> @Html.DisplayFor(modelItem => item.veh_make)
</td>
<td>
<b>Model:</b> @Html.DisplayFor(modelItem => item.veh_model)
</td>
<td>
<b>Color:</b> @Html.DisplayFor(modelItem => item.veh_color)
</td>
<td>
<b>Plate:</b> @Html.DisplayFor(modelItem => item.veh_plate)
</td>
</tr>
</table>
}
我不明白的是:为什么当我直接查询 SQL Server 视图时,我得到了正确的 2 辆车 logon_id = A。但是当我通过存储库运行相同的查询时,我会得到 2 条记录,但在 foreach 循环中,它是相同的记录两次。
SQL Server 视图是内部联接。我还可以发布更多信息(如果需要,模型等)
答:
从实体框架使用视图时,视图存在一个微妙的问题。
如果有表,请将其与 EF 一起使用,需要有一个主键来唯一标识每一行。通常,这是一列,例如 an 或类似的东西。ID
对于视图,您没有“主键”的概念 - 视图仅包含某些表中的一些列。
因此,当 EF 映射视图时,它找不到主键 - 因此,它将使用视图中所有不可为 null 的列作为“替代”主键。
我不知道这些在你的情况下是什么 - 你应该能够从模型中看出来。.edmx
所以问题在于你不能在视图上有显式的主键。
最简单的解决方案是简单地将视图定义中涉及的两个表中的主键包括在内(即使您不想显示它们)。
这样,这些将在视图中,并且它们是不可为空的,因此您应该没问题并且不会获得任何重复项。
评论
item
SQL
Controller