从实体框架代码第一方法的时态表中获取SYSTEM_TIME信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从实体框架代码第一方法的时态表中获取SYSTEM_TIME信息相关的知识,希望对你有一定的参考价值。

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

该过程通常需要两个步骤:

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

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

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

我的问题是:如何通过Entity Framework获取它?

该链接还说:

在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直接查询表。

谢谢。

答案

我一直在研究这个并找到了解决方案。它实际上非常简单。只需使用Database.SqlQuery Method

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

另见:Raw SQL Queries

以上是关于从实体框架代码第一方法的时态表中获取SYSTEM_TIME信息的主要内容,如果未能解决你的问题,请参考以下文章

实体框架不使用时态表

如何从使用实体框架的外键链接的多个表中获取所有数据?

Net Core:实体框架和 SQL Server 时态表、自动脚手架

如何将系统版本化的时态表与实体框架一起使用?

EF - 从表中获取数据给出空值

实体框架第一次查询比第二次慢得多