2010-01-08 68 views
1

我有一個標準的更新通過linq到sql發生,但數據不會持久到數據庫。Linq到Sql更新不會持久到數據庫

我通過.dbml文件設計師使用自動生成的類。

UPDATE語句如下:

public static void UpdateEmailsInWorkingTable(Guid emailGuid, string modifiedEmail) 
{ 
     using (EmailDBDataContext DBContext = new EmailDBDataContext()) 
     { 
      EmailAddress_Update EAUpdated = (from e in DBContext.EmailAddress_Updates 
              where e.EmailGuid == emailGuid 
              select e).SingleOrDefault(); 

      EAUpdated.EmailAddress = modifiedEmail; 
      EAUpdated.IsValid = 'Y'; 
      EAUpdated.UpdateFlag = true; 
      EAUpdated.LastChangedDtTm = DateTime.Now; 
      try 
      { 
       DBContext.SubmitChanges(ConflictMode.FailOnFirstConflict); 
      } 
      catch (ChangeConflictException ex) 
      { 
       // do stuff here 
      } 
     } 
} 

我看遍了我的自動生成的DataContext類,唯一明顯的區別是,有問題的表EmailAddress_Update沒有實現這兩個接口INotifyPropertyChanging和INotifyPropertyChanged的,其他自動生成的實體。

我假設,這是爲什麼所做的更改不會被持久化的原因是它不???

簡單地說沒有擴展方法的定義爲這一類的任何部分獲取生成。如果這是我的問題的原因,數據庫中的什麼會導致這不會自動生成正確?

謝謝〜

+3

在你的try catch塊中是EmailDBContext假設是DBContext? – 2010-01-08 00:51:13

+0

對不起,我修改了它,並忘記在那裏修改它 - 這不影響原始問題,只是我的一個錯字。 – 2010-01-08 16:20:12

+0

如果你調用'SingleOrDefault',你最好處理'EAUpdated'可以是空指針的事實。如果你不想處理空情況,那麼你應該調用'Single'。 – 2010-01-08 18:39:28

回答

2

我張貼了這個問題,在MSDN上以及在這裏:MSDN Linq to Sql如果你想看到的答覆。但是我發現代碼不能生成的部分原因。

這裏是我的MSDN響應一塊:

我創建了一個小的測試表沒有主密鑰,並將其添加到設計果然它沒有產生任何的擴展方法該實例。

所以我加入到同一個表格和主鍵它重新添加到設計果然所有的擴展方法,並更改生成跟蹤事件。現在

我的問題是,爲什麼一定要有這個東西自動生成主鍵?

0

好了,所以回答我的問題:「我現在的問題是,爲什麼必須要有這個東西自動生成主鍵?」我發現它在喬·約瑟夫·Rattz寫的書臨LINQ,小

我閱讀如何處理的意見與表和他這樣說:

「因爲對視圖生成的實體類不包含映射爲主鍵的實體類屬性,它們是隻讀的。如果您認爲沒有主鍵,則DataContext沒有提供身份跟蹤的有效方法,這是有道理的。「

神祕和問題解決。