2009-12-18 50 views
0

在WPF應用程序中,我在多層應用程序中使用Linq to SQL。Linq to SQL EntitySet導致重複插入的記錄

(這是一個古文字照片歸檔應用程序),所以每個挖掘都有其相應的圖片,因此是一對多的關係。這種關係是由SQLMetal(我用來創建POCO)正確創建的。

因此,這裏是我在遇到問題的情況:

儲蓄變化(無論是新的或改變的對象)通過的UnitOfWork()完成模式是這樣的:

using (IUnitOfWork unitOfWork = UnitOfWork.Begin()) 
       { 
     //if this is a new record 
        if (SelectedExcavation.excavation.ExcavationId == 0) 
        { 
         IsNewRecord = true; 
         excavService.Add(SelectedExcavation.excavation); 
        } 

        //send the actual changes to the dbms 
        unitOfWork.Commit(); 
       } 

一切正常!

BUTTTT !!!

1)一種新的開挖記錄被插入

2)當前開挖記錄得到更新

3:對應圖片記錄

每當記錄被更新,其具有(已經至少一個) )之前的圖片記錄將其ID更改爲新創建的ExcavationId

發生了什麼情況? Linq to SQL不處理這種簡單的更新場景嗎?

預先感謝

+0

我有種感覺abo完成您的UnitOfWork模式作業,以及如何處理多層Linq 2 Sql?你附加()該對象並更新它?或再次查詢數據庫並使用從某處獲得的實例更改值! – 2009-12-18 12:33:35

+0

其實我什麼也沒做! 附加只給出錯誤!我確信Entityset正在造成這種行爲,但不知道如何處理這個問題! – 2009-12-18 18:15:28

回答

0

在該WPF應用程序我使用統一登記其被作爲構造參數到IUnitOfWork通過IDataContext。我實際上使用多層架構(它應該總是給我一個單獨的IUnitOfWork對象,因此是一個單獨的IDataContext),但我想僞造這種行爲,使IUnitOfWork始終是相同的實例(因此, IDataContext實例在我的應用程序中處處相同)。

這意味着應用程序實際上使用了一個(經典的)兩層應用程序來處理datacontext!

...以及我解決的實例(使用Unity)實際上在我的應用程序中處處都是一樣的(我使用GetHashCode()來確認這一點)。

所以一切似乎按預期工作!

但正如我在我以前的帖子,只要記錄有相應的EntitySet的記錄,並得到更新DataContext的馬上做(按照這個順序)表示:

1)的主記錄值的插入最初在現有的記錄改變

2)詳細記錄的更新改變其標識到新的主記錄在步驟1)

3)用更改的(新)值更新主記錄。

步驟1)和2)應NEVER出現,而只有第3步)是正確的(也應該出現在DataContext的唯一的一個。

我在很多博客的閱讀您必須附加/分離,並做一些黑魔法事情來克服這種情況,但正如我傷心:只有一個和相同的DataContext無處不在,所以記錄總是附加到它,所以這種現象不應該出現!我錯過了什麼)!???

任何幫助表示讚賞!