2009-11-29 61 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