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?