Вот способ, которым я делаю это в приложении EF6 / MVC5 VB.NET.
Проблема: использование одного запроса для возврата значения getdate()
, а затем использование другого запроса для обновления записи с полученным значением getdate()
недопустимо ИМХО. Это два запроса, где требуется только один. Кроме того, возвращенное значение getdate()
технически не является точным к моменту его обратной записи, поскольку время прошло.
Решение: приведенный ниже фрагмент обновляет единичное поле даты и времени со значением NULL до текущего значения getdate()
и возвращает обновленное значение getdate()
(если вам не нужно возвращенное значение, просто удалите сегмент OUTPUT INSERTED.theTime
). Все это делается в SQL-запросе.
Dim theTime As DateTime? = db.Database.SqlQuery(Of DateTime?) _
("UPDATE myTable SET theTime = getdate() OUTPUT INSERTED.theTime WHERE someRecordID = @someRecordID", New SqlParameter("@someRecordID", someRecordID)).First()
Похоже, должно быть какое-то лучшее решение (или это серьезный недосмотр со стороны MS, разве не используется getdate () распространенная и правильная практика при обновлении записей?). Я был бы рад, если бы кто-то мог указать более чистый подход в комментариях или другой ответ.
В идеале я хотел бы иметь возможность сформулировать это следующим образом:
Dim craftBeer = context.CraftBeers.Find(id)
... (update other craftBeer properties) ...
craftBeer.date_emptied = SqlServer.SqlFunction.GetDate
context.Entry(craftBeer).State = EntityState.Modfied
context.SaveChanges()
... но, к сожалению, SqlServer.SqlFunctions.GetDate, по-видимому, не работает с EF следующим образом.