2017-01-06 50 views
7

Mogę używać tabel czasowych w SQL Server 2016. Entity Framework 6 niestety jeszcze nie zna tej funkcji. Czy istnieje możliwość obejścia możliwości korzystania z nowych opcji zapytań (patrz msdn) za pomocą Entity Framework 6?Jak używać tabeli temporalnej z systemem Entity Framework?

stworzyłem prosty projekt demo z pracownikiem tabeli czasowej: enter image description here

użyłem edmx mapować stół do podmiotu (thanks to Matt Ruwe): enter image description here

wszystko działa poprawnie z czystym 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(); 
}  

Czy można dodać funkcjonalność historii do każdego obiektu bez czystego sql? Moje rozwiązanie jako rozszerzenie jednostki z refleksją nad manipulowaniem zapytaniem sql z IQuerable nie jest idealne. Czy istnieje istniejące rozszerzenie lub biblioteka, aby to zrobić?

edit: (Na podstawie komentarzem Pawel)

próbowałem użyć wycenione tabela funkcji:

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

muszę utworzyć funkcję dla każdego podmiotu czy istnieje ogólna opcja?

+1

Czy uważane za pomocą TVF? – Pawel

+0

Możliwe jest uzyskanie prawidłowego typu obiektu? W tym przykładzie GetEmployeeHistory retruns Pracownik zamiast "nieznany" typ? – cSteusloff

+0

Tak. Możliwe jest uzyskanie właściwego typu jednostki. Nie pamiętam z góry, ale projektant może chcieć dodać typ do modelu dla twojego TVF. Nie chcesz tego - chcesz użyć istniejącego typu. Ważne jest to, że TVFs zwraca odpowiednie kolumny, aby możliwe było zmaterializowanie podmiotów. – Pawel

Odpowiedz

-1

Utwórz widok z tabelą temporalną (historia) i zamapuj ten widok na strukturę obiektu.

Egs:

CREATE VIEW V_View 
AS 
select * from hist.TableHistory 

i mapa z V_View do Entity Framework

+0

Możesz wtedy po prostu zmapować tabelę historii w tekście danych, nie widzę punktu widoku? –

+0

Witam @JordyvanEijk, nie jestem pewien, czy obecne wydanie EF ma bezpośrednią metodę łączenia Tabeli Tempral albo na początku kodu, albo na DB First. Musisz więc zrobić niestandardowy sposób i uniknąć tego lepszego wykorzystania Zobacz. Proszę, daj mi znać tutaj. –