MVC | Linq更新查询|救命!

时间:2011-01-30 23:00:39

标签: c# asp.net-mvc linq controller

我正在修改我继承的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 });
        }

对于上述尝试,我得到一个序列包含无元素错误。

任何帮助或指示将不胜感激。谢谢你们。

2 个答案:

答案 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();
    }