Vb.net 不能更改定义对象标识的LINQ到SQL成员

Vb.net 不能更改定义对象标识的LINQ到SQL成员,vb.net,linq-to-sql,Vb.net,Linq To Sql,我正在为LINQ到SQL CUD编写一个通用代码。我 '通用插入 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 S

我正在为LINQ到SQL CUD编写一个通用代码。我

'通用插入

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)
    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)
'使用通用更新

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)
    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)
来自常规更新的错误消息

类型为“TestAuthor”的对象的成员“Id”的值已更改。 无法更改定义对象标识的成员。 考虑添加具有新标识的新对象,并删除现有的对象。


修改通用更新需要什么?谢谢。

您的newEntity对象没有Id 4,它有Id 0,因此这两个对象不会被视为对应于同一数据库行

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

仅供参考,LINQ to SQL假定您附加的对象未修改。我读了一篇文章,它有一个很好的解决方案,没有添加时间戳列

'通用更新 '需要导入System.Data.Linq

公共共享子更新(T作为类)(ByVal oldEntity作为T,ByVal newEntity作为T)

端接头

'使用通用更新

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)
    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)

谢谢。

它给出如下错误:未找到或更改行
说明:在执行当前web请求期间发生未经处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源
异常详细信息:System.Data.Linq.ChangeConflictException:未找到或更改行。