代码之家  ›  专栏  ›  技术社区  ›  Tola

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

  •  2
  • Tola  · 技术社区  · 16 年前

    '通用插入

    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
    

    '通用更新

    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 回复  |  直到 16 年前
        1
  •  4
  •   Mark Byers    16 年前

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

    Dim newEntity As New TestAuthor
    newEntity.Id = oldEntity.Id
    newEntity.FirstName = TextBox1.Text
    newEntity.LastName = TextBox2.Text
    
        2
  •  2
  •   Tola    16 年前

    仅供参考,LINQ to SQL假定您附加的对象未修改。我读了一篇帖子 here ,这是一个很好的解决方案,无需添加时间戳列。

    '需要导入System.Data.Linq

    公共共享子更新(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)
    

    非常感谢。