2017-01-06 14 views
7

SQL Server 2016で一時テーブルを使用できますが、残念ながらEntity Framework 6はこの機能をまだ認識していません。 Entity Framework 6で新しいクエリオプション(msdnを参照)を使用する回避策がありますか?Entity FrameworkでSystem-Versioned Temporal Tableを使用するにはどうすればよいですか?

私は従業員の一時的なテーブルとの簡単なデモプロジェクト作成:私は、エンティティ(thanks to Matt Ruwe)にテーブルをマップするためにEDMXを使用 enter image description here

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

pure SQLを使用しないすべてのエンティティに履歴機能を追加できますか? IQuerableからのSQLクエリを操作するためのリフレクションによるエンティティ拡張としての私のソリューションは完璧ではありません。 これを行うための既存の拡張機能やライブラリがありますか?

編集:

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

が、私は、各エンティティの関数を作成する必要がありますか:私はテーブル値関数を使用しようとした

Pawelによる解説に基づいて)または一般的なオプションはありますか?

+1

にV_View地図は、あなたがTVFを使用して考えがありますか? – Pawel

+0

正しいエンティティタイプを取得することは可能ですか?この例では、GetEmployeeHistoryは "unknown"の代わりにEmployeeを再実行しますか? – cSteusloff

+0

はい。正しいエンティティタイプを取得することは可能です。私は頭の上から覚えていませんが、デザイナーはTVFのモデルに型を追加したいかもしれません。あなたはそれを望んでいません - あなたは既存のタイプを使いたいと思います。重要なのは、TVFが右の列を返すので、エンティティをマテリアライズできることです。 – Pawel

答えて

-1

一時テーブル(履歴)でビューを作成し、このビューをEntity Frameworkにマップします。

EGS:

CREATE VIEW V_View 
AS 
select * from hist.TableHistory 

そして、Entity Frameworkの

+0

これで、datacontextの履歴テーブルをマップすることができます。ビューのポイントが表示されませんか? –

+0

こんにちは@JordyvanEijk、私はEFの現在のリリースTempralテーブルをリンクする直接的な方法がコードファーストまたはDBの最初を持っているか分からない。だからあなたはカスタム方法を行う必要があり、これを避けるためにViewを使います。あなたのコメントをここで教えてください。 –

関連する問題