gpt4 book ai didi

c# - 如何将系统版本化时态表与 Entity Framework 一起使用?

转载 作者:IT王子 更新时间:2023-10-29 04:39:52 25 4
gpt4 key购买 nike

我可以在 SQL Server 2016 中使用临时表。遗憾的是, Entity Framework 6 尚不支持此功能。是否有可能通过 Entity Framework 6 使用新的查询选项(请参阅 msdn)?

我使用员工时态表创建了一个简单的演示项目:

enter image description here

我使用 edmx 将表映射到实体 ( thanks to Matt Ruwe ):

enter image description here

纯 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 查询并不完美。是否有现有的扩展程序或库来执行此操作?

编辑:(基于 Pawel 的评论)

我尝试使用表值函数:

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 专家 交流。

这是一个已知的 issue .我发现的最佳建议是按照说明使用 FromSql here .

关于c# - 如何将系统版本化时态表与 Entity Framework 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41514629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com