如何将 SQL 服务器更改跟踪与 Entity Framework 一起使用

How to use SQL Server Change Tracking with Entity Framework

SQL 服务器有一个非常有用的功能,称为更改跟踪,它使客户端能够跟踪 table 中数据的更新和插入。

我想知道,EF 是否支持使用这些使用 CHANGETABLE() 函数的查询?否则你知道任何第三方图书馆吗?或者使用 EF 实现它的任何技巧?

您始终可以在 EF 中传递原始 TSQL。但我假设您希望实体以与 table 或视图相同的方式引用更改 table。

虽然没有亲身体验,但理论上应该还是可以的。

您实质上是将实体映射到 table 值函数。我相信从 EF 6 开始,您可以添加 TVF 的方式与添加对存储过程的调用的方式相同,这会创建一个复杂的类型,但您可以使用它。

问题是 CHANGETABLE() 是 SQLServer 系统语法,而不是具有用户定义或系统定义的 table 值函数的 1-1 映射,因此您可能必须使用您自己的用户定义的 TVF 或存储过程围绕它构建您自己的脚手架,然后从 EF 调用它。

using (var ctx = new TestEntities())
{
    /* Execute TVF that calls changetable */

    /* wrapper for a call to CHANGETABLE() on the server side */
    var changes = ctx.GetChangeTable().ToList<Change>();
}

您可能会首先在数据库中创建 UDF 来封装 CHANGETABLE 访问。类似于:

create or alter function GetChanges_Employee_Insert(@last_sync_version bigint)
returns table
as
return
SELECT e.*
FROM CHANGETABLE (CHANGES HumanResources.Employee, @last_sync_version) AS c  
    LEFT OUTER JOIN HumanResources.Employee AS e  
        ON e.[BusinessEntityID] = c.[BusinessEntityID] 
where c.SYS_CHANGE_OPERATION = 'I'

这会创建一个 Employee 形状的结果,您可以将其加载到现有的 Employee 实体中。