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

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

3
Ahmad 8 Окт 2018 в 19:43

2 ответа

Лучший ответ

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

1
David Browne - Microsoft 8 Окт 2018 в 18:26

Вы всегда можете передать необработанный 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>();
}
1
RThomas 8 Окт 2018 в 18:01