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

问题描述 投票:0回答:1

我按照此链接“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直接查询表。

谢谢。

c# entity-framework ef-code-first temporal
1个回答
0
投票

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

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

另见:Raw SQL Queries

© www.soinside.com 2019 - 2024. All rights reserved.