2011-10-07 80 views
4

我試圖在通用資源庫中創建一個更新方法作爲LINQ to SQL數據訪問層。使用DataContext更新實體時更新檢查問題附加方法

我有一個這樣的實體:

[Table] 
public class Product 
{ 
    [Column(IsPrimaryKey = true, IsDbGenerated = true, 
    DbType = "Int NOT NULL IDENTITY")] 
    public int Id { get; private set; } 
    [Column(UpdateCheck = UpdateCheck.Never)] 
    public string Name { get; set; } 
    .... 
} 

我爲exept爲ID爲@jeff阿特伍德建議在this post的所有字段設置Update Check = true和我設置的連接法asModified屬性格式爲真我在this post發現如下:

public void Update(T entity) 
{ 
    _db.GetTable<T>().Attach(entity, true); 
    _db.SubmitChanges(); 
} 

,但我不斷收到同樣的異常:

如果 聲明版本成員或沒有更新檢查策略,則實體只能在沒有原始狀態的情況下作爲修改進行連接。

那麼是什麼問題?

除了創建時間戳列作爲版本號之外,您是否建議使用其他方法在通用存儲庫中創建更新方法?

回答

2

我們用下面的代碼在我們的DAO解決同一個問題:
(例如而已,不必在此刻對我來說,真正的代碼)

public void UpdateUser(tblUser user) 
{ 
    WriteDataContect.Attach 
    (
     user, 
     ReadOnlyDataContext.tblUsers 
         .Select(o => o.UserId == user.UserId) 
    ); 
    WriteDataContext.SubmitChanges(); 
} 

ReadOnlyDataContext有TrackChanges = FALSE;

根據我們的需求,我們找不到另一種解決方案,無需編寫大量管道代碼。 修改數據庫以適應LinqToSql對時間戳列的需求也不是我們的選擇。

額外的數據庫調用並未在我們的測試中產生任何問題。

0

您可以從db中讀取實體並複製字段。我不喜歡這種方法,但在處理類似問題時,我們必須這樣做。

你永遠不知道該對象是否已經加載到上下文中,如果是這樣的話,無論如何你都會得到一個異常。至少EF是這種情況,但對於linq for sql也是合乎邏輯的。