2012-02-08 20 views
0

我有一個MVC3視圖,它通過Ajax將一組輸入值回傳給我的控制器。然後,我的控制器在我的上下文中創建一個新的FieldTripRoute對象,並嘗試將其插入到數據庫中。Linq到SQL行未找到或更改插入操作異常在MVC3中操作Ajax回發

我只是無法弄清楚發生了什麼事情。我已經三重檢查了我的Designer模式和我的數據庫模式,並且它們完美匹配。所以它不可能是一個不存在或在一個區域可空的列的正常問題,而不是另一個區域的空。但是,每次我嘗試提交更改時,都會收到「未找到或更改行」異常。

異常堆棧跟蹤看起來是這樣的:

at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges() 
    at ManageMAT.Controllers.FieldTripController.RouteAdd(Int32 id, FormCollection collection) 

這是被呼叫從控制器添加新幹線對象的代碼:

 [HttpPost] 
     public ActionResult RouteAdd(int id, FormCollection collection) 
     { 
      FieldTrip trip = context.FieldTrips.Single(ft => ft.ID == id); 

      if (trip == null) return Json(new { success = false, message = "Field trip not found." }); ; 

      try 
      { 

       FieldTripRoute tripRoute = new FieldTripRoute(); 

       tripRoute.FieldTripID = trip.ID;     
       tripRoute.Date = DateTime.Parse(collection["Date"]); 
       tripRoute.ArrivalTime = DateTime.Parse(collection["ArrivalTime"] + " " + DateTime.Now.ToShortDateString()); 
       tripRoute.DepartureTime = DateTime.Parse(collection["DepartureTime"] + " " + DateTime.Now.ToShortDateString()); 
       tripRoute.Destination = collection["Destination"]; 
       tripRoute.PickupLocation = collection["PickupLocation"]; 
       tripRoute.RouteID = Convert.ToInt32(collection["RouteID"]);   

       context.FieldTripRoutes.InsertOnSubmit(tripRoute); 
       context.SubmitChanges(); 

       return Json(new { success = true, message = "Success!" }); 
      } 
      catch (Exception ex) 
      { 
       return Json(new { success = false, message = ex.Message }); 
      } 
     } 

這裏是我的設計師和數據庫表列:

Designer and DB Table Columns

我也試圖在上下文對象和SQL事件探查器中可用的日誌記錄中查看它正在輸出的SQL,但它在連接到數據庫服務器之前似乎失敗了。

編輯:忘了添加一個其他的東西,當我在添加動作開始時創建新的FieldTripRoute對象時,我注意到它沒有從數據庫標識系列中檢索正確的ID。也許這是相關的?

我也試過在設計器中的每個字段上設置更新檢查從不只是看它是不是一種奇怪的併發衝突發生,但我仍然收到相同的錯誤。

我真的對可能導致此問題的原因感到茫然。任何想法都表示讚賞。

回答

1

無論出於何種原因,每次插入行時都會引發此消息。對於DML語句,Linq to SQL檢查修改行的數量。 SQL Server返回這個計數。它被檢查爲一個。

最大的問題是爲什麼計數爲零,但SQL Server沒有發送錯誤消息。啓動SQL Server分析器併發布L2S生成的SQL。手動運行SQL,看看會發生什麼。一行是否被插入?它的身份值是否被返回?

編輯:提前進行調試:在您進入SubmitChanges之前關閉SQL Server,以確保數據庫未被命中。讓我們確保從搜索樹中刪除這個分支。

接下來,進入Linq to SQL源代碼以查看最新信息。如果你有R#這很容易:按ctrl-shift-t,搜索ChangeProcessor,單擊並導航到「符號文件中的源」。找到函數SubmitChanges並在其中放置一個斷點。如果你沒有R#,你需要在網上挖掘一些教程(這將需要大約5分鐘)。

通過源代碼來找到拋出異常的原因。

+0

是的,這是我忘記提及的另一件事,我創建一個新的對象後檢查ID值,我得到0回來。正確的ID應該是92我相信基於當前的表身份值。 此外,我試圖檢查SQL,但它甚至在生成它之前拋出異常。據我所知,Linq內部的某些東西甚至在它碰到數據庫之前就拋出它。當我在數據庫上運行分析器時,它在拋出異常之前甚至沒有觸及它。 – Philter 2012-02-08 22:12:41

+0

我添加了更多說明。 – usr 2012-02-08 22:23:23

+0

ID值應該只在SubmitChanges上更新,順便說一句。這個是正常的。也許你沒有在L2S中配置ID字段更新模式爲「自動同步」? – usr 2012-02-08 22:25:43