2011-06-27 433 views
2

我非常需要幫助。我花了一整天的時間,甚至沒有一個小時浪費在一個項目上。我有一個LINQ to SQL的數據層,並使用下面的代碼在做一個簡單的插入到數據庫:當NOT NULL時Linq to SQL「無法插入值NULL」!

using (var odc = new OrdersDataContext()) 
     { 
      try 
      { 
       var id = GetNextOrderId(odc); 
       order.ID = id; 
       odc.tblOrders.InsertOnSubmit(order); 
       odc.SubmitChanges(); 
      } 
      catch (Exception ex) 
      { 
       Logger.LogException(ex); 
      } 
     } 

由於其他遺留代碼,這是這是在SQL 2000上運行的數據庫,我不能讓數據庫變更,但是這段代碼在一點上工作正常,然後停止工作。它是這樣說的:

無法將值NULL插入'ID'列'表'Order';列不允許有空值。 INSERT失敗。

但是,正如您從代碼中所看到的以及在代碼中可以清楚地看到的那樣,ID列獲取有效的ID號。 由於某些原因,即使我設置了ID字段,它仍試圖將其作爲null插入,即使此代碼在之前工作正常。我甚至完全恢復數據庫並重建數據層,但無濟於事。

我很難過這個和時間,我在我身邊。

+1

絕對沒有機會GetNextOrderId(odc)可以在不拋出異常的情況下返回null? – jpm

+1

您是否嘗試運行分析器來查看正在生成併發送到數據庫的SQL? – kprobst

+0

jpm ...我看到ID一直正確設置,直到它進入InsertOnSubmit方法,但它一直試圖提交一個空值。我的假設我出於某種原因,沒有任何價值觀正在設定,整個對象經過爲空,但我不明白爲什麼。在這一點上,我必須開始假設這是由於在某處使用了緩存版本的代碼。其他沒有任何意義。 – webwires

回答

1

所以,這個答案很奇怪,我不是100%肯定的原因。基本上我所做的是完全重建LINQ to SQL數據層(只需在設計器中拖放相同的表格),然後徹底清理並重建整個解決方案。之後,代碼再次神奇地工作。無需更改代碼。

由於某些原因,代碼被錯誤地緩存,導致它無法將對象傳輸到數據層(這是我的猜測)。在這種情況下恢復似乎是一個奇怪的錯誤。