【问题标题】:How to use SQL Server Change Tracking with Entity Framework如何将 SQL Server 更改跟踪与实体框架一起使用
【发布时间】:2018-10-08 16:43:03
【问题描述】:

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

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

【问题讨论】:

  • EF 的变化跟踪和Sql Server 的变化跟踪是两个完全不同的概念。他们没有任何关系,也不能以任何方式进行合作。当然,正如答案所暗示的,您可以运行原始 SQL 来获取 SQL Server 的更改跟踪信息,但这会“实施”任何“技巧”。你想达到什么目的?这里有什么更大的图景?
  • @GertArnold 你误解了这个概念,我的朋友。我说的是“SQL Server 更改跟踪”。请谷歌它以了解更多信息。
  • 好吧,我在说别的吗?无论如何,如果您能更好地解释您要实现的目标,那将更具建设性。或者,如果他们确实回答了您不清楚的问题,请接受其中一个答案。
  • @GertArnold “EF 的变更跟踪和 Sql Server 的变更跟踪是两个完全不同的概念”。这是什么意思?这个问题对我来说似乎很清楚,我想执行CHANGETABLE() 查询,我将以适当的方式使用 EF。
  • 看,是你在一个问题中提到了这两个完全不同的概念,所以显而易见的结论是你试图以某种方式将它们联系起来。如果不是,第一段只是噪音,可以删除。也许你应该回应给定的答案。不清楚他们是否对您有帮助。

标签: sql-server entity-framework change-tracking


【解决方案1】:

您可能首先在数据库中创建 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 实体中。

【讨论】:

    【解决方案2】:

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

    虽然我没有亲身经历,但理论上这应该仍然有效。

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

    我看到的问题是 CHANGETABLE() 是 SQLServer 系统语法,而不是与用户定义或系统定义的表值函数的 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>();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      相关资源
      最近更新 更多