代码之家  ›  专栏  ›  技术社区  ›  Ahmad

如何在实体框架中使用SQLServer更改跟踪

  •  2
  • Ahmad  · 技术社区  · 6 年前

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

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   David Browne - Microsoft    6 年前

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

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

        2
  •  1
  •   RThomas    6 年前

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

    您实际上是将实体映射到表值函数。我相信,在ef6中,您可以以与向存储过程添加调用相同的方式添加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>();
    }
    
    推荐文章