通过实体框架代码优先方法从时态表中获取SYSTEM_TIME信息

时间:2018-09-05 02:06:15

标签: c# entity-framework ef-code-first temporal

我按照此链接“ Cutting Edge - Soft Updates with Temporal Tables”上的说明创建了时间表

该过程通常分两个步骤:

  1. 创建常规表;这只是Code First通常要做的工作
  2. 通过添加SysStartTimeSysEndTime列并启用SYSTEM_VERSIONING设置来更改表格

到目前为止,一切看起来都很不错。

但是,请注意,实体类不具有SysStartTime属性和SysEndTime属性,因为它们是在以后添加的。这给我带来麻烦,因为我需要从表中获取SysStartTime的信息。

我的问题是:如何使用实体框架获得它?

该链接还显示:

  

在EF 6中,您只能利用DbSet类的SqlQuery方法:

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 :(得分:0)

我已经研究了这个问题,并找到了解决方案。实际上很简单。只需使用Database.SqlQuery Method

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

另请参阅:Raw SQL Queries