我按照此链接“ Cutting Edge - Soft Updates with Temporal Tables”上的说明创建了时间表
该过程通常分两个步骤:
SysStartTime
,SysEndTime
列并启用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直接查询表。
谢谢。
答案 0 :(得分:0)
我已经研究了这个问题,并找到了解决方案。实际上很简单。只需使用Database.SqlQuery Method
DateTime time = context.Database.SqlQuery<DateTime>("SELECT SysStartTime
FROM dbo.Calibration
WHERE CalibrationID = 1")
.SingleOrDefault();
另请参阅:Raw SQL Queries