我正在修改我继承的C#MVC应用程序。
我有一个数据库,为简单起见,我只关注我正在使用的这个linq查询的两个表。
物品
ItemID Int PK
ITEMNAME
RepairSelection(是或否)
RepairID Int FK
修复
RepairID Int PK
RepairCategory
SubmissionDate
DateSentForRepair
好的,所以ItemID几乎就是标识符,显示修复详细信息的视图就像这样(摘录):
<%= Html.LabelFor(x => x.ItemID)%>
<%= Html.DisplayFor(x => x.ItemID)%><br />
<%= Html.LabelFor(x => x.Repair.RepairCategory)%>
<%= Html.DisplayFor(x => x.Repair.RepairCategory, "FormTextShort")%><br />
<%= Html.LabelFor(x => x.Repair.SubmissionDate)%>
<%= Html.DisplayFor(x => x.Repair.SubmissionDate)%><br />
<%= Html.LabelFor(x => x.Repair.DateSentForRepair)%>
<%= Html.DisplayFor(x => x.Repair.DateSentForRepair)%><br />
<%= Html.ActionLink("Edit Repair Details", "Edit", new { ItemID= Model.ItemID})%>
以下是GET Edit操作:
public ActionResult Edit(Int64? itemId)
{
ModelContainer ctn = new ModelContainer();
var item = from i in ctn.Items where i.ItemID == itemId select i;
return View(item.First());
}
这也没关系,GET Edit视图显示正确的详细信息。我遇到的是更新Repair表的linq查询。我今天已经尝试了很多方法,我的头只是油炸的(你可能已经猜到了Linq的新手)。我最近的尝试就在这里(我知道这样做很容易;-)):
[HttpPost]
public ActionResult Edit(Int64 itemId, Repair repair, Item item, FormCollection formValues)
{
if (formValues["cancelButton"] != null)
{
return RedirectToAction("View", new { ItemID = itemId });
}
ModelContainer ctn = new ModelContainer();
Repair existingData = ctn.Repair.First(a => a.RepairId == item.RepairID && item.ItemID == itemId);
existingData.SentForConversion = DateTime.Parse(formValues["SentForConversion"]);
ctn.SaveChanges();
return RedirectToAction("View", new { ItemID = itemId });
}
对于上述尝试,我得到一个序列包含无元素错误。
任何帮助或指示将不胜感激。谢谢你们。
答案 0 :(得分:1)
我自己解决了这个问题。我只是采用不同的方法。当我现在点击编辑动作链接时,我将继承repairID而不是itemID,只需直接编辑修复条目。
答案 1 :(得分:0)
看起来像Items表中的repairID缺少Repair表中的相应行,
使用以下查询检查数据:
SELECT RepairID FROM Items
EXCEPT
SELECT RepairID FROM Repair
这将列出修复表中缺少的所有修复ID。
如果需要更正案例数据,或者您需要使用 FirstOrDefault 并检查返回值为空性,即:
Repair existingData = ctn.Repair.FirstOrDefault(a => a.RepairId == item.RepairID && item.ItemID == itemId);
if( existingData!= null)
{
existingData.SentForConversion = DateTime.Parse(formValues["SentForConversion"]);
ctn.SaveChanges();
}