Получить информацию SYSTEM_TIME из временной таблицы по методу кода Entity Framework первым - PullRequest
0 голосов
/ 05 сентября 2018

Я создал свою временную таблицу, следуя инструкциям по этой ссылке " Cutting Edge - мягкие обновления с временными таблицами "

Процедура обычно состоит из двух шагов:

  1. создать обычную таблицу; это именно та работа, которую Code First обычно выполняет
  2. изменить таблицу, добавив столбцы SysStartTime, SysEndTime и включив параметр SYSTEM_VERSIONING

Пока все выглядит хорошо.

Однако обратите внимание, что у класса сущностей нет свойства SysStartTime и SysEndTime, поскольку они добавляются позже. Это доставляет мне неприятности, так как мне нужно получить информацию SysStartTime из таблицы.

Мой вопрос: как я могу получить его с Entity Framework?

Ссылка также говорит:

В EF 6 вы можете использовать только метод SqlQuery класса DbSet:

using (var db = new EF6Context())
{
  var current = db.Bookings.Single(b => b.Id == 1);
  var time = DateTime.Now.AddMinutes(-5);
  var old = db.Bookings
    .SqlQuery("SELECT * FROM dbo.Bookings
          FOR SYSTEM_TIME AS OF {0} WHERE Id = 1", time)
    .SingleOrDefault();
}

Обратите внимание, что для EF 6 имена столбцов, возвращаемые в запросе, должны совпадать с именами свойств в классе. Это потому, что SqlQuery не использует сопоставления. Если имена столбцов и свойств не совпадают, вам нужно будет создать псевдоним столбцов в списке SELECT, а не просто SELECT *.

Понятия не имею, как это сделать или это решит мою проблему. У кого-нибудь есть опыт по этому поводу?

Я могу придумать одно решение - добавить дополнительный столбец AppliedTime в мою таблицу, добавив AppliedTime в мой класс сущностей. Он имеет (почти, но достаточно для меня) то же значение, что и SysStartTime.

Другим решением может быть использование простого SQL для непосредственного запроса к таблице.

Спасибо.

1 Ответ

0 голосов
/ 10 сентября 2018

Я работал над этим и нашел решение. Это на самом деле довольно просто. Просто используйте Database.SqlQuery Method

DateTime time = context.Database.SqlQuery<DateTime>("SELECT SysStartTime 
                                                     FROM dbo.Calibration 
                                                     WHERE CalibrationID = 1") 
                                                     .SingleOrDefault();

См. Также: Необработанные SQL-запросы

...