LINQ to SQL Невозможно изменить элемент, определяющий идентификатор объекта - PullRequest
2 голосов
/ 29 ноября 2009

Я пишу универсальный для LINQ to SQL CUD. I

'Универсальная вставка

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)

Сообщение об ошибке из общего обновления.

Изменено значение элемента 'Id' объекта типа 'TestAuthor'. Член, определяющий идентичность объекта, не может быть изменен. Попробуйте добавить новый объект с новым идентификатором и удалить вместо него существующий.

Что мне нужно для изменения общего обновления? Спасибо.

Ответы [ 2 ]

4 голосов
/ 29 ноября 2009

Ваш объект newEntity не имеет Id 4, он имеет Id 0, поэтому два объекта не считаются соответствующими одной строке базы данных.

Dim newEntity As New TestAuthor
newEntity.Id = oldEntity.Id
newEntity.FirstName = TextBox1.Text
newEntity.LastName = TextBox2.Text
2 голосов
/ 29 ноября 2009

FYI, LINQ to SQL предполагает, что объект, который вы присоединяете, не модифицирован. Я прочитал пост здесь , в котором есть хорошее решение без добавления столбца TimeStamp.

'Общее обновление 'Необходимо импортировать 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()

End Sub

'Использовать общее обновление

    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)

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...