SQL Server 2016で一時テーブルを使用できますが、残念ながらEntity Framework 6はこの機能をまだ認識していません。 Entity Framework 6で新しいクエリオプション(msdnを参照)を使用する回避策がありますか?Entity FrameworkでSystem-Versioned Temporal Tableを使用するにはどうすればよいですか?
私は従業員の一時的なテーブルとの簡単なデモプロジェクト作成:私は、エンティティ(thanks to Matt Ruwe)にテーブルをマップするためにEDMXを使用
すべては、純粋な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による解説に基づいて)または一般的なオプションはありますか?
にV_View地図は、あなたがTVFを使用して考えがありますか? – Pawel
正しいエンティティタイプを取得することは可能ですか?この例では、GetEmployeeHistoryは "unknown"の代わりにEmployeeを再実行しますか? – cSteusloff
はい。正しいエンティティタイプを取得することは可能です。私は頭の上から覚えていませんが、デザイナーはTVFのモデルに型を追加したいかもしれません。あなたはそれを望んでいません - あなたは既存のタイプを使いたいと思います。重要なのは、TVFが右の列を返すので、エンティティをマテリアライズできることです。 – Pawel