Когда я обновляю базу данных, мне приходится жестко сопоставлять код каждого свойства, потому что использование присоединения приводит к исключению. Это не кажется слишком элегантным. Есть ли какое-то более простое решение, о котором я не знаю? Ниже приведен код, показывающий метод «MapData», который я вызываю для этой цели:
Кстати, классы сущностей (здесь; Пользователи) автоматически генерируются с помощью SqlMetal.
Public Class UserDataService
Public Sub Save(ByVal user As Users)
Dim ctx As New TestDB(connection)
Dim id As Integer = user.Id
If user.Id = 0 Then
Insert(user)
Else
Dim q = (From n In ctx.Users Where n.Id = id Select n).Single
q.MapData(user)
For Each o In user.Orders
o.Save()
Next
' ctx.Users.Attach(user, q) ' Does not work
' ctx.Users.Attach(user, True) ' Does not work
End If
ctx.SubmitChanges()
ctx.Dispose()
End Sub
End Class
Partial Public Class Users
Public Sub MapData(ByVal row As Users)
Me.Name = row.Name
End Sub
End Class
РЕДАКТИРОВАТЬ1:
Исключения:
ctx.Users.Attach (пользователь, q)
Невозможно добавить объект с ключом, который уже используется.
ctx.Users.Attach (пользователь, True)
Сущность может быть присоединена как измененная без исходного состояния, только если она объявляет член версии или не имеет политики проверки обновлений.
EDIT2:
Я попытался добавить метку времени столбца, которая, как мне кажется, должна удовлетворять последнему упомянутому исключению. Поэтому я добавляю столбец, показанный здесь. Это не помогает, но, возможно, мне нужно сделать некоторые дополнительные настройки, чтобы это было эффективно?