2017-01-06 13 views
7

Tôi có thể sử dụng bảng thời gian trong SQL Server 2016. Entity Framework 6 không may là chưa biết tính năng này. Có khả năng giải pháp khác để sử dụng các tùy chọn truy vấn mới (xem msdn) với Khung thực thể 6 không?Làm cách nào để sử dụng Bảng tạm thời được hệ thống hóa với Khuôn khổ thực thể?

Tôi tạo ra một dự án trình diễn đơn giản với một bảng thời gian người lao động: enter image description here

tôi đã sử dụng edmx để ánh xạ bảng để tổ chức (thanks to Matt Ruwe): enter image description here

Tất cả mọi thứ hoạt động tốt với các báo cáo tinh khiết 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(); 
}  

Có thể thêm chức năng lịch sử cho mọi thực thể không có sql thuần túy không? Giải pháp của tôi như là phần mở rộng thực thể với sự phản chiếu để thao tác truy vấn sql từ IQuerable không hoàn hảo. Có tiện ích mở rộng hoặc thư viện hiện tại để thực hiện việc này không?

chỉnh sửa: (Dựa trên những lời bình luận bởi Pawel)

tôi cố gắng sử dụng một bảng giá trị Chức năng:

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

Tôi có phải tạo một hàm cho từng đối tượng hoặc có một lựa chọn chung?

+1

Bạn đã xem là sử dụng một TVF? – Pawel

+0

Có thể lấy đúng loại thực thể? Trong ví dụ này, GetEmployeeHistory retruns Employee thay vì loại "unknown"? – cSteusloff

+0

Có. Có thể lấy đúng loại thực thể. Tôi không nhớ từ đỉnh đầu của tôi nhưng nhà thiết kế có thể muốn thêm một loại cho mô hình cho TVF của bạn. Bạn không muốn điều đó - bạn muốn sử dụng loại hiện có. Điều quan trọng là TVFs trả về các cột bên phải để có thể thực hiện các thực thể. – Pawel

Trả lời

-1

Tạo chế độ xem với Bảng tạm thời (Lịch sử) và ánh xạ Chế độ xem này vào Khung thực thể.

EGS:

CREATE VIEW V_View 
AS 
select * from hist.TableHistory 

và bản đồ V_View để Entity Framework

+0

Bạn có thể chỉ cần ánh xạ bảng lịch sử trong nội dung dữ liệu của bạn, tôi không thấy quan điểm? –

+0

Xin chào @JordyvanEijk, tôi không chắc chắn bản phát hành hiện tại của EF có phương pháp trực tiếp để liên kết Bảng Tempral hoặc Mã Đầu tiên hay DB Đầu tiên. Vì vậy, bạn phải làm theo cách tùy chỉnh và để tránh điều này sử dụng tốt hơn Xem. Xin vui lòng cho tôi biết bình luận của bạn ở đây. –

Các vấn đề liên quan