2017-01-06 10 views
7

Я могу использовать временные таблицы в SQL Server 2016. Entity Framework 6, к сожалению, еще не знает эту функцию. Есть ли возможность обхода пути использовать новые параметры запросов (см. msdn) с Entity Framework 6?Как использовать временную таблицу с системной версией и платформу Entity Framework?

Я создал простой демонстрационный проект с временной таблицей сотрудников: 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].[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? Мое решение как расширение объекта с отражением для обработки запроса sql из IQuerable не является совершенным. Есть ли существующее расширение или библиотека для этого?

редактировать: (на основе комментария 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(); 
} 

Должен ли я создать функцию для каждого объекта или существует общий вариант?

+1

Рассматривали ли вы с помощью TVF? – Pawel

+0

Можно получить правильный тип объекта? В этом примере GetEmployeeHistory извлекает Employee вместо «неизвестного» типа? – cSteusloff

+0

Да. Можно получить правильный тип объекта. Я не помню из головы, но дизайнер может захотеть добавить тип к модели для вашего TVF. Вы не хотите этого - вы хотите использовать существующий тип. Важно то, что TVF возвращает правильные столбцы, чтобы материализовать объекты. – Pawel

ответ

-1

Создайте представление с временной таблицей (история) и сопоставьте это представление с инфраструктурой Entity Framework.

Egs:

CREATE VIEW V_View 
AS 
select * from hist.TableHistory 

и карта V_View в Entity Framework

+0

Вы можете просто нарисовать таблицу истории в вашем datacontext, я не вижу точку зрения? –

+0

Привет @JordyvanEijk, я не уверен, что в текущем выпуске EF есть прямой метод, чтобы связать Tempral Table либо Code First, либо DB First. Таким образом, вы должны делать свой собственный способ и избегать этого лучше использовать View. Пожалуйста, дайте мне знать ваш комментарий здесь. –