Я использую таблицы Sql без преобразования строк и времени. Однако мне нужно использовать Linq для обновления определенных значений в таблице. Поскольку Linq не может знать, какие значения обновлять, я использую второй DataContext для извлечения текущего объекта из базы данных и использую и базу данных, и фактический объект в качестве входных данных для метода Attach, например:
Public Sub SaveCustomer(ByVal cust As Customer)
Using dc As New AppDataContext()
If (cust.Id > 0) Then
Dim tempCust As Customer = Nothing
Using dc2 As New AppDataContext()
tempCust = dc2.Customers.Single(Function(c) c.Id = cust.Id)
End Using
dc.Customers.Attach(cust, tempCust)
Else
dc.Customers.InsertOnSubmit(cust)
End If
dc.SubmitChanges()
End Using
End Sub
Хотя это работает, у меня есть проблема: я также использую StoredProcedures для обновления некоторых полей Customer в определенные моменты времени. Теперь представьте следующий рабочий процесс:
- Получить клиента из базы данных
- Установить в поле клиента новое значение
- Использование хранимой процедуры для обновления другого поля клиента
- Позвонить в SaveCustomer
Что происходит сейчас, так это то, что метод SaveCustomer извлекает текущий объект из базы данных, которая не содержит значение, установленное в коде, но содержит значение, установленное хранимой процедурой. При присоединении этого к фактическому объекту и последующей передаче он обновит значение, установленное в коде, также в базе данных, и ... tadaaaa ... установит другое значение равным NULL, поскольку фактический объект не содержит изменений, сделанных хранимая процедура.
Это было понятно?
Есть ли лучшая практика для решения этой проблемы?