2010-01-18 87 views
6

我最近收到客戶的錯誤報告,並沒有解決它的問題。我希望有人能給我一些見解,看看可能是錯的。使用Linq2SQL刪除記錄時出錯

誤差看起來很簡單:

Csla.DataPortalException:DataPortal.Delete失敗(System.InvalidOperationException:序列含有System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable`1源多於一個的元件)

這裏是我的DataPortal_Delete方法,它接受的fileid(PK)作爲參數。

private void DataPortal_Delete(SingleCriteria<File, Guid> criteria) 
    { 
     using (var ctx = ContextManager<Ronin.Data.RoninDataContext> 
        .GetManager(Database.ApplicationConnection, false)) 
     { 
      var data = ctx.DataContext.Files 
        .Single(row => row.FileId == criteria.Value); 

      ctx.DataContext.FileSources.DeleteAllOnSubmit(data.FileSources); 

      ctx.DataContext.Files.DeleteOnSubmit(data); 

      ctx.DataContext.SubmitChanges(); 
     } 
    } 

我檢查的第一件事就是看看是否有具有相同的fileid再創紀錄(儘管是初步的ry鍵,這應該是不可能的)。所有的FileId實際上都是獨一無二的。我啓動了連接到客戶端數據庫的應用程序,並試圖刪除該記錄,並且沒有任何問題。客戶端的IT人員使用「問題步驟記錄器」向我發送用戶所採取行動的逐步截圖。沒有什麼不尋常的,當他使用不同的機器時,他能夠毫無錯誤地刪除記錄。顯然,這隻發生在Windows 7中運行應用程序。

這就是說,有什麼想法可能是造成這種情況?

+0

Files.FileId是該表上的主鍵? – 2010-01-19 22:40:35

+0

你確定錯誤是由這段代碼產生的嗎?該錯誤引用SingleOrDefault,但函數使用Single。 – gfrizzle 2010-01-21 21:52:13

+0

FileSources是否爲空?如果這些是不同的對象,那麼在你刪除它們之前你不需要使用include來獲取它們嗎? – awright18 2010-02-20 02:13:37

回答

1

假設調用單是問題的根源,而不是:

ctx.DataContext.Files.Single(...) 

變化的代碼,允許多行從該查詢返回,然後登錄時,它會返回更比它的返回一排。這應該指向你的「重複」數據問題。

另一個要看的是在幕後生成的SQL。不確定這會有幫助,但它不會傷害。我不知道你的數據模型,所以我無法理解你的代碼以及我想要的。

+0

有例外的消息很清楚; Single強制只返回一行。兩個或更多將導致例外。儘管如此,我不會改變代碼。一個簡單的sql語句將找到這個僞指令:'select fileid,從文件組中選擇count(*)by fileid count(*)> 1' – Andy 2011-03-30 00:18:09

0

如果它只發生在Windows 7中,那麼這可能是由操作系統造成的。你在Vista上試過了嗎? Vista的環境與Windows 7相似。您也可以使用Windows Virtual PC + XP Mode。這是專門爲Windows 7設計的虛擬化應用程序,可讓用戶在Windows XP中運行應用程序。注意:XP Mode需要支持虛擬化的處理器。

0

我刪除時有同樣的例外一個實體。問題原來是在dbml-File中定義的外鍵關係。所以這是我例外的原因。 我刪除後,它的工作刪除記錄(我不想從另一個表中級聯刪除記錄,我只需要找出如何配置linq-to-sql到設置外鍵列到null)