从 Entity Framework 代码优先方法的时间 table 获取 SYSTEM_TIME 信息

Get SYSTEM_TIME information from a temporal table on Entity Framework code first method

我按照有关此 link“Cutting Edge - Soft Updates with Temporal Tables

的说明创建了时间 table

程序一般分为两步:

  1. 创建常规table;这正是 Code First 通常做的工作
  2. 通过添加 SysStartTimeSysEndTime 列并打开 SYSTEM_VERSIONING 设置
  3. 来更改 table

到目前为止一切看起来都很好。

但是,请注意实体 class 没有 SysStartTime 属性 和 SysEndTime 属性,因为它们是稍后添加的。这给我带来了麻烦,因为我需要从 table 获取 SysStartTime 的信息。

我的问题是:如何使用 Entity Framework 获取它?

link 还说:

In EF 6, you can only leverage the SqlQuery method of the DbSet class:

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();
}

Note that for EF 6, the column names returned in the query need to match the property names on the class. This is because SqlQuery doesn’t use mappings. If column and property names don’t match, then you’d need to alias the columns in the SELECT list, rather than just SELECT *.

我不知道该怎么做,也不知道它是否能解决我的问题。有没有人有这方面的经验?

我能想到的一种解决方案是通过将 AppliedTime 添加到我的实体 class 来在我的 table 上添加一个额外的列 AppliedTime。它具有(几乎,但对我来说足够好)与 SysStartTime.

相同的值

另一种解决方案是使用普通 SQL 直接查询 table。

谢谢。

我一直在研究这个问题并找到了解决方案。其实很简单。只需使用 Database.SqlQuery Method

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

另请参阅:Raw SQL Queries