Как запросить у сервера базы данных текущее время и дату, используя структуру сущностей? - PullRequest
9 голосов
/ 06 апреля 2010

У меня есть сущность со свойством ModifiedDateTime, которую я хочу обновить с использованием текущей даты и времени из базы данных вместо сервера «приложения», выполняющего приложение.

Каждый раз, когда я хочу обновить или добавить человека в свою базу данных на SQL Server 2008, я хочу заполнить поле ModifiedDateTime. Я не могу изменить запрос на обновление, как с помощью команды адаптера данных, когда я работаю с набором данных, и определить для моего поля ModifiedDateTime значение GetDate (). Я создал хранимую функцию, чтобы вернуть мне значение метода GetDate (), но у меня есть проблема с импортом процедуры, которая возвращает значения в виде int, строки или вообще без значения, уже просто значения сущностей как Person, например, в моем случае. Это почему?

В любом случае, было бы очень полезно, если бы вы могли помочь мне получить текущий DateTime с сервера базы данных.

Ответы [ 4 ]

13 голосов
/ 06 апреля 2010

Есть ли причина, по которой вы просто не можете отправить ее в свою базу данных? Если вы включите DateTime.Now в запрос сущности, он отправит его (getdate) в базу данных.

Пример linq для сущностей

 var dQuery = dbContext.CreateQuery<DateTime>("CurrentDateTime() ");
 DateTime dbDate = dQuery.AsEnumerable().First();

Сгенерированный SQL ..

SELECT GetDate() AS [C1] FROM  ( SELECT cast(1 as bit) AS X ) AS [SingleRowTable1]

Может быть, лучший способ сделать это?

9 голосов
/ 24 июня 2015

Это обновление ответа @Nix на EF4:

var dateQuery = dbContext.Database.SqlQuery<DateTime>("SELECT getdate()");
DateTime serverDate = dateQuery.AsEnumerable().First();
0 голосов
/ 21 февраля 2019

Обновление для .net core 2.0

var dual =  databaseContext
            .Set<Dual>()
            .FromSql("SELECT -1 AS Id, GETDATE() AS DateTime")
            .First();

Поддельная сущность

public class Dual
{
    public int Id { get; set; }
    public DateTime DateTime { get; set; }
}
0 голосов
/ 06 апреля 2010

В VS 2008, если вы добавляете шаблон функции для возврата скаляра, он не добавляет код для упрощения использования. Вам нужно получить доступ к шаблону функции напрямую - я использую частичный класс для создания необходимых методов для простоты использования. Они исправили это в VS2010.

    public DateTime GetDateTime()
    {
        var returnValue = new DateTime();
        using (var connection = new EntityConnection(Connection.ConnectionString))
        {
            connection.Open();
            using (var command = connection.CreateCommand())
            {
                command.CommandText = "myStoredProc";
                command.CommandType = CommandType.StoredProcedure;
                try
                {
                    returnValue = Convert.ToDateTime(command.ExecuteScalar());
                }
                finally
                {
                    connection.Close();
                }
            }
        }
        return returnValue;
    }

Дополнительная информация: Импорт функций в модель сущности с типом возврата, не являющимся сущностью

...