Sql server 如何在实体框架中使用SQL Server更改跟踪

Sql server 如何在实体框架中使用SQL Server更改跟踪,sql-server,entity-framework,change-tracking,Sql Server,Entity Framework,Change Tracking,SQL Server有一个非常有用的功能,称为更改跟踪,它使客户端能够跟踪表中数据的更新和插入 我想知道,EF是否支持使用这些使用CHANGETABLE()函数的查询?否则你知道任何第三方图书馆吗?或者使用EF实现它的任何技巧?您始终可以在EF中传递原始TSQL。但我假设您希望实体以与表或视图相同的方式引用变更表 虽然我没有个人经验,但理论上这仍然有效 您实际上是将实体映射到表值函数。我相信在EF 6中,您可以以与向存储过程添加调用相同的方式添加TVF,这将创建一个复杂类型,但您可以使用它 问题

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


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

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

虽然我没有个人经验,但理论上这仍然有效

您实际上是将实体映射到表值函数。我相信在EF 6中,您可以以与向存储过程添加调用相同的方式添加TVF,这将创建一个复杂类型,但您可以使用它

问题是()是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>();
}
使用(var ctx=newtestentities())
{
/*执行调用changetable的TVF*/
/*服务器端对CHANGETABLE()调用的包装器*/
var changes=ctx.GetChangeTable().ToList();
}

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

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

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