2009-10-25 71 views
0

我真的是LINQ新手。我有一個未知的問題:SubmitChanges()只更新1個字段?

public static int save(TEntity obj) 
    { 
     var table = dbo.GetTable<TEntity>(); 
     var mapping = dbo.Mapping.GetTable(typeof(TEntity)); 
     var pkfield = mapping.RowType.DataMembers.Where(d => d.IsPrimaryKey).Take(1).SingleOrDefault(); 
     if (Convert.ToInt32(obj.GetType().GetProperty(pkfield.Name).GetValue(obj, null)) == 0) 
      table.InsertOnSubmit(obj); 
     try 
     { 
      dbo.SubmitChanges(); 
     } 
     catch (ChangeConflictException e) 
     { 
      dbo.SubmitChanges(); 
     } 
     if (dbo.ChangeConflicts.Count == 0) 
     { 
      ClearCache(dbo); 
      return Convert.ToInt32(obj.GetType().GetProperty(pkfield.Name).GetValue(obj, null)); 
     } 
     else 
     { 
      dbo.ChangeConflicts.ResolveAll(System.Data.Linq.RefreshMode.KeepCurrentValues); 
      return 0; 
     } 
    } 

當使用此方法時,只有1個字段已更新!這是我的日誌:

UPDATE [dbo].[tbl_album] 
SET [dt_m_date] = @p1 
WHERE [i_album_id] = @p0 
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] 
-- @p1: Input BigInt (Size = 0; Prec = 0; Scale = 0) [1256485605] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4918 

即使我改變了幾乎字段,我的表已經有主鍵了。但仍然存在問題。

請幫忙!

回答

0

您是否通過您的save方法來查看代碼在做什麼?它找到了正確的主鍵列嗎?它確實檢測到現有主鍵的存在嗎?

您在tbl_album中有哪些字段 - 您是否確定它們沒有被標記爲只讀(不太可能,但仍然 - 檢查確定!)。

我沒有看到antyhing現在對你的代碼有根本性的錯誤,這對我的口味來說似乎有點複雜,但它應該工作,我相信。

馬克

UPDATE:
檢查,以確保您的表列不都是隻讀! :)

alt text http://i35.tinypic.com/mt8sw2.png

+0

謝謝Marc。 我仔細檢查過該方法。我仍然不知道爲什麼會發生這種情況。一切正常,直到SubmitChanges()被執行。我所有的字段都有足夠的設置和獲取方法。 – 2009-10-25 10:17:07

+0

因爲我的代碼太長,所以我不能把它們全部放在這裏。 無論如何,幾乎所有列都設置了以下屬性: [Column(Name =「i_artist_id」,Storage =「_ArtistID」,DbType =「Int NOT NULL DEFAULT 0」,CanBeNull = false,UpdateCheck = UpdateCheck.Never) ] 你對'只讀'屬性意味着什麼?我沒有發現這樣的事情。我的數據庫中也沒有「只讀」字段。 謝謝Marc! – 2009-10-25 10:57:04

+0

Marc, 我檢查了,但所有隻讀都是錯誤的。有沒有合理的方法? – 2009-10-25 14:02:23

0

做大量的測試後,我發現了一兩件事:不更新所有外鍵,正常領域都還好。那麼告訴我,是否有任何合理的方式導致這種廢話?

我GOOGLE了很多,但什麼都沒發現...