从实体框架代码第一方法的时态表中获取SYSTEM_TIME信息
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从实体框架代码第一方法的时态表中获取SYSTEM_TIME信息相关的知识,希望对你有一定的参考价值。
我按照此链接“Cutting Edge - Soft Updates with Temporal Tables”上的说明创建了我的时态表
该过程通常需要两个步骤:
- 创建常规表;这只是Code First通常所做的工作
- 通过添加
SysStartTime
,SysEndTime
列并打开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();
以上是关于从实体框架代码第一方法的时态表中获取SYSTEM_TIME信息的主要内容,如果未能解决你的问题,请参考以下文章