2011-01-30 75 views
0

我正在修改我繼承的C#MVC應用程序。MVC | Linq更新查詢|幫幫我!

我有一個數據庫,爲了簡單起見,我將重點介紹我爲這個linq查詢所使用的兩個表。

項目
項目ID詮釋PK
ITEMNAME
RepairSelection(是或否)
RepairID詮釋FK

修復
RepairID詮釋PK
RepairCategory
SubmissionDate
DateSen tForRepair

好了,項目ID是相當多的標識,並顯示修復的詳細信息,查看是這樣的(片段):

  <%= 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編輯動作:

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編輯視圖顯示正確的細節。我卡住的地方是更新修復表的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 }); 
     } 

對於上述的嘗試,我得到一個序列不包含任何元素的錯誤。

任何幫助或指針,將不勝感激。多謝你們。

回答

1

我已經解決了這個問題我自己。我只是用一種不同的方法。當我點擊編輯動作鏈接時,我會繼續修復ID而不是itemID,並直接編輯修復條目。

0

看起來像在項目表中的維修表中相應的行缺少repairID,

檢查使用下面的查詢數據:

SELECT RepairID FROM Items 
EXCEPT 
SELECT RepairID FROM Repair 

這將列出你所有的失蹤repairID在修理表。

如果需要修正的情況下的數據,或者需要使用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(); 
    } 
+0

感謝您的回覆。我剛剛更新了我的問題。我應該提到在項目表中,我有一個'RepairSelection'列,它可以是或不是。當創建初始修復條目時,它會更新爲「是」。我通過這個條件篩選我的Items列表,所以數據肯定存在。我希望這可以更好地說明情況:) – 109221793 2011-01-30 23:22:54