2009-12-10 67 views
0

我正在開發一個WPF應用程序(.NET 3.5SP1)。場景是這樣的:LINQ to SQL更新WPF應用程序中的問題

1.使用SQL Metal提取實體定義(和相應的映射文件),後來用於數據訪問層(所以我使用LINQ to SQL)。

2.使用Unity(此應用程序是「基於PRISM的」)來註冊抽象類及其相應的實現(例如IRepository和ActualRepository,IDataContext和ActualContext,IUnitOfWork和ActualUnitOfWork等等 - 類名是不是真正的,但這裏並不重要)

3.MVVM樣式用於創建ViewModel和View。

插入和刪除工作得很好..但後來我發現這個怪異的行爲:

一)通過創建一個新的記錄,並填寫一些字段的用戶能夠保存這個(新)記錄只有一次! !如果用戶忘記將某些數據插入其他字段並嘗試保存此記錄(再次),則這些更改不會反映在dbms中!

因此,用戶關閉了應用程序,再次打開應用程序並加載(之前插入的)記錄。現在:每次更改這些記錄實際上反映到dbms!

我認爲它必須與DataContext的問題(這是創建這樣:

public SQLDataContext(string connectionString) 
     { 
      dc = new DataContext(connectionString, Mapping.GetMapping()); 
     } 

我做了一些谷歌搜索,發現關於分離對象的一些問題。我不確定這是否與我的情況有關,但是閱讀一些博客我明白它必須!

長話短說:我以爲我在我的表中使用時間戳字段。 b)Said ..done!Et瞧:新創建的記錄在第一次保存後可以保存多次。即使關閉和重新開放應用程序工作正常!

但是:araised一個新問題!

一個視圖使用了一些組合框。只要我們播放的這條記錄是實際記錄,綁定到這些組合框的字段就會正確更新。當我們移動到下一個記錄時,之前的當前記錄將其字段(綁定到組合框)分配給null!我認爲這是一個具有約束力的問題,並且很明顯地在組合框中放置了雙向綁定模式,但沒有結果。

這讓我瘋狂! (在情況a)我沒有遇到這些問題!!!!)

綁定到TextBoxes的字段按預期工作! 順便說一句:我沒有得到任何綁定錯誤!

所以:有人可以解釋爲什麼情況a)的行爲是這樣嗎?爲什麼b)綁定到WPF組合框的字段表現如此呢?

在此先感謝

回答

0

如果你再使用LINQ to SQL的上下文保存後選擇,不這樣做。

最佳做法是,創建一個新的上下文的插入/更新/刪除,包裹在一個使用:

using(var dc = new DataContext()) 
{ 
    // Delete/Change/Insert some objects 

    dc.SaveChanges(); 
} 

創建結合

+0

問題茲是另一個新DataContext實例時(重新)我創建Datacontext這樣: using(IUnitOfWork unitOfWork = UnitOfWork.Begin()) { unitOfWork.Commit(); } 和UnitOfWork.Begin()被以這種方式定義: 公共靜態IUnitOfWork開始() { 返回ServiceLocator.Current.GetInstance (); } 正如我上面所說,我使用的是團結。所以我擔心的是Unity會始終返回相同的上下文! – 2009-12-11 07:24:45

+0

您是否正在使用單獨的工作單位進行保存和提取? – 2009-12-11 13:15:41

+0

我認爲我找到了解決我的問題(谷歌搜索多一點後): a)刪除時間戳字段 b)保存記錄涉及檢查(在UnitOfWork.Begin()後): if(newRecord){add (object)} else {refresh(object)}; commitWork(); 希望這是固定的! 但我仍然有這個問題與組合框! – 2009-12-11 16:10:45