framework foreign data c# sql entity-framework sql-server-2016 temporal

c# - foreign - ¿Cómo puedo usar la tabla temporal con versión de sistema con Entity Framework?



entity framework c# foreign key (1)

No, me temo que no puedes. He estado de ida y vuelta con Microsoft gurus en este frente.

Este es un issue conocido. Y el mejor consejo que he encontrado es usar FromSql como se explica here .

Puedo usar tablas temporales en SQL Server 2016. Lamentablemente, Entity Framework 6 aún no conoce esta característica. ¿Existe la posibilidad de una solución alternativa para usar las nuevas opciones de consulta (ver msdn ) con Entity Framework 6?

Creé un proyecto de demostración simple con una tabla temporal de empleados:

Usé el edmx para asignar la tabla a la entidad ( gracias a Matt Ruwe ):

Todo funciona bien con declaraciones de SQL puro:

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(); }

¿Es posible agregar la funcionalidad de historial a cada entidad sin SQL puro? Mi solución como extensión de entidad con reflexión para manipular la consulta SQL de IQuerable no es perfecta. ¿Hay una extensión o biblioteca existente para hacer esto?

Edición: (Basado en el comentario de Pawel )

Intenté usar una función de tabla de valores:

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(); }

¿Tengo que crear una función para cada entidad o hay una opción genérica?