我可以在SQL Server 2016中使用时态表。不幸的是,实体框架6还不知道这个特性。是否有可能在实体框架6中使用新的查询选项(请参见msdn)。
我用一个雇员临时表创建了一个简单的演示项目:
我使用EDMX将表映射到实体(thanks to Matt Ruwe):
使用纯SQL语句,一切都可以正常工作:
using (var context = new TemporalEntities())
{
var employee = context.Employees.Single(e => e.EmployeeID == 2);
var query =
$@"SELECT * FROM [TemporalTest].[dbo].[{nameof(Employee)}]
FOR SYSTEM_TIME BETWEEN
'0001-01-01 00:00:00.00' AND '{employee.ValidTo:O}'
WHERE EmployeeID = 2";
var historyOfEmployee = context.Employees.SqlQuery(query).ToList();
}
是否可以在不使用纯SQL的情况下向每个实体添加历史记录功能?我的解决方案作为带有反射的实体扩展来操作来自
IQuerable
的SQL查询,这并不完美。是否有现有的扩展或库来执行此操作?
编辑:(基于评论)
我尝试使用表值函数:
CREATE FUNCTION dbo.GetEmployeeHistory(
@EmployeeID int,
@startTime datetime2,
@endTime datetime2)
RETURNS TABLE
AS
RETURN
(
SELECT
EmployeeID,
[Name],
Position,
Department,
[Address],
ValidFrom,
ValidTo
FROM dbo.Employee
FOR SYSTEM_TIME BETWEEN @startTime AND @endTime
WHERE EmployeeID = @EmployeeID
);
using (var context = new TemporalEntities())
{
var employee = context.Employees.Single(e => e.EmployeeID == 2);
var historyOfEmployee =
context.GetEmployeeHistory(2, DateTime.MinValue, employee.ValidTo).ToList();
}
我必须为每个实体创建一个函数还是有一个通用选项?
最佳答案:
不,恐怕你不能。我曾在这方面与Microsoft gurus
进行过多次交流。
这是一个已知的issue。
我发现最好的建议是使用FromSql
如解释的那样。