Как использовать отслеживание изменений SQL Server с Entity Framework - PullRequest
0 голосов
/ 08 октября 2018

SQL Server имеет очень полезную возможность, называемую отслеживанием изменений, которая позволяет клиентам отслеживать обновления и вставку данных в таблицу.

Мне интересно, поддерживает ли EF эти запросы, использующие функцию CHANGETABLE()?Иначе знаете ли вы какую-нибудь стороннюю библиотеку?Или какой-нибудь трюк, чтобы реализовать это с помощью EF?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вы, вероятно, начнете с создания 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'

Это создает результат в форме Сотрудника, который можно загрузить в существующую сущность Сотрудника.

0 голосов
/ 08 октября 2018

Вы всегда можете передать необработанный TSQL в EF.Но я предполагаю, что вы хотите, чтобы объект ссылался на таблицу изменений так же, как на таблицу или представление.

Хотя у меня нет личного опыта, теоретически это все равно должно работать.

По сути, вы отображаете сущность в табличную функцию.Я полагаю, что с 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>();
}
...