2009-11-29 34 views
2

我正在爲LINQ to SQL CUD編寫一個通用類。我LINQ to SQL定義對象身份的成員不能更改

「通用插入

Public Shared Sub Add(Of T As Class)(ByVal entity As T) 

    Using db As New APIUDataContext() 

     db.GetTable(Of T)().InsertOnSubmit(entity) 
     db.SubmitChanges() 

    End Using 

的genric插入工作良好。

'通用更新

Public Shared Sub Update(Of T As Class)(ByVal oldEntity As T, ByVal newEntity As T) 

    Dim db As New DemoDataContext() 

    db.GetTable(Of T)().Attach(newEntity, oldEntity) 
    db.SubmitChanges() 

End Sub 

' 使用通用的更新

Dim oldEntity As New TestAuthor 
    oldEntity.Id = 4 
    oldEntity.FirstName = "James" 

    Dim newEntity As New TestAuthor 
    newEntity.FirstName = TextBox1.Text 
    newEntity.LastName = TextBox2.Text 

    GenericCUD.Update(oldEntity, newEntity) 

錯誤從通用更新消息。

「TestAuthor」類型的對象的成員'Id'的值已更改。 定義對象身份的成員無法更改。 考慮添加一個具有新身份的新對象,並刪除現有的對象。

我需要修改通用更新?謝謝。

回答

2

僅供參考,LINQ to SQL假定您所連接的對象未被修改。我閱讀了一篇文章here,它有一個很好的解決方案,不需要添加TimeStamp列。

'通用更新 ' 需要進口將System.Data.Linq

公共共享更新子(OF T作爲類)(BYVAL oldEntity作爲T,BYVAL newEntity作爲T)

Dim db As New DemoDataContext() 

db.GetTable(Of T)().Attach(newEntity, oldEntity) 
db.Refresh(RefreshMode.KeepCurrentValues, newEntity) 

db.SubmitChanges() 

完子

「使用通用的更新

Dim oldEntity As New TestAuthor 
    oldEntity.Id = 4 

    Dim newEntity As New TestAuthor 
    newEntity.Id = oldEntity.Id 
    newEntity.FirstName = TextBox1.Text 
    newEntity.LastName = TextBox2.Text 

    GenericCUD.UpdateMe(oldEntity, newEntity) 

謝謝。

4

您的newEntity對象沒有Id 4,它具有Id 0,因此這兩個對象不被視爲對應於同一個數據庫行。

Dim newEntity As New TestAuthor 
newEntity.Id = oldEntity.Id 
newEntity.FirstName = TextBox1.Text 
newEntity.LastName = TextBox2.Text 
+0

它給出了這樣的錯誤: 行未找到或更改。
描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。
異常詳細信息:System.Data.Linq.ChangeConflictException:找不到或更改了行。 – 2009-11-29 10:49:59