Entity Framework - обновить значение поля до текущего времени сервера БД - PullRequest
5 голосов
/ 10 декабря 2010

Я извлекаю объект сущности из базы данных, и мне нужно обновить дату до даты / времени сервера БД - обычно это можно сделать, установив его с помощью функции SQL getDate().

Как я могу сделать это в следующем сценарии:

var client = context.client.Where(c=>c.clientID == 1).FirstOrDefault();

// the value needs to be the value of the server's current date, i.e, getDate()... not DateTime.Now
client.someDate = <somevalue>;
context.SaveChanges();

Ответы [ 5 ]

4 голосов
/ 02 апреля 2011

Попробуйте вставить следующее вместо четвертой строки в вашем образце:

var dateQuery = context.CreateQuery<DateTime>("CurrentDateTime() ");
client.SomeDate = dateQuery.AsEnumerable().First();
0 голосов
/ 10 сентября 2018

Возможно, слишком поздно, но я оставляю это, если это может кому-то помочь. Мы можем получить текущую дату и время с сервера базы данных с помощью чего-то вроде:

public DateTime GetDate()
{ 
  var date = context.client.Select(c => DateTime.Now).First(); 
  return date;
}

, поэтому мы используем функцию:

var client = context.client.Where(c=>c.clientID == 1).FirstOrDefault();
client.someDate = GetDate();
context.client.Add(client);
0 голосов
/ 15 октября 2015

Я вижу, что это очень старый вопрос, но у меня тоже есть эта проблема.Мне просто пришло в голову, что вы можете создать скалярную функцию на SQL Server, которая просто ВОЗВРАЩАЕТ GETDATE ().Затем в рамках сущности перетащите эту функцию SQL в свой контекст.Кажется немного надуманным, но я думаю, что это сработает.

0 голосов
/ 10 декабря 2014

Вот способ, которым я делаю это в приложении 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 следующим образом.

0 голосов
/ 10 декабря 2010

DateTime.Now выдаст текущую дату с вашего сервера (веб-сервер, а не сервер БД). если client.someDate - это поле DateTime, то вы можете назначить DateTime.Now и обновить его до базы данных.

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