2 Stimmen

LINQ to SQL Ein Element, das die Identität des Objekts definiert, kann nicht geändert werden

Ich schreibe ein Generic für LINQ to SQL CUD. I

'Generischer Einsatz

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

Der Genric Insert funktioniert gut.

Generisches Update

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

Generisches Update verwenden

    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)

Fehlermeldung von Generic Update.

Wert des Mitglieds 'Id' eines Objekts des Typs 'TestAuthor' geändert. Ein Element, das die Identität des Objekts definiert, kann nicht geändert werden. Fügen Sie ein neues Objekt mit einer neuen Identität hinzu und löschen Sie stattdessen das vorhandene Objekt.

Was muss ich tun, um das Generic Update zu ändern? Ich danke Ihnen.

4voto

Mark Byers Punkte 761508

Ihr newEntity-Objekt hat nicht die Id 4, sondern die Id 0, so dass die beiden Objekte nicht der gleichen Datenbankzeile entsprechen.

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

2voto

Tola Punkte 2351

Zu Ihrer Information: LINQ to SQL geht davon aus, dass das Objekt, das Sie anhängen, nicht geändert wird. Ich habe einen Beitrag gelesen aquí die eine gute Lösung bietet, ohne die Spalte TimeStamp hinzuzufügen.

Generisches Update Notwendigkeit des Imports von System.Data.Linq

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.Refresh(RefreshMode.KeepCurrentValues, newEntity)

db.SubmitChanges()

End Sub

Generisches Update verwenden

    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)

Gracias.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X