Как использовать отслеживание изменений SQL Server с Entity Framework

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

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


person Ahmad    schedule 08.10.2018    source источник
comment
Отслеживание изменений EF и Sql Server - это две совершенно разные концепции. Они никоим образом не связаны и никоим образом не могут сотрудничать. Конечно, как следует из ответов, вы можете запустить необработанный SQL, чтобы получить информацию об отслеживании изменений SQL Server, но это реализует любой трюк. Чего вы пытаетесь достичь? Что здесь общего?   -  person Gert Arnold    schedule 08.10.2018
comment
@GertArnold Вы неправильно поняли концепцию, мой друг. Я говорю об отслеживании изменений в SQL Server. Пожалуйста, погуглите, чтобы узнать больше.   -  person Ahmad    schedule 08.10.2018
comment
Ну, я о чем-то еще говорил? В любом случае, было бы более конструктивно, если бы вы лучше объяснили, чего пытаетесь достичь. Или примите один из ответов, если они действительно ответили на ваш неясный вопрос.   -  person Gert Arnold    schedule 08.10.2018
comment
Отслеживание изменений @GertArnold EF и Sql Server - это две совершенно разные концепции. Что это значит? Вопрос кажется мне настолько ясным, что я хочу выполнять CHANGETABLE() запросы и собираюсь использовать для этого EF должным образом.   -  person Ahmad    schedule 09.10.2018
comment
Послушайте, это вы упоминаете эти две совершенно разные концепции в одном вопросе, поэтому очевидный вывод состоит в том, что вы пытаетесь как-то связать их. Если нет, то первый абзац - это просто шум, и его можно удалить. Возможно, вам стоит ответить на данные ответы. Неясно, были ли они вам полезны.   -  person Gert Arnold    schedule 09.10.2018


Ответы (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'

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

person David Browne - Microsoft    schedule 08.10.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>();
}
person RThomas    schedule 08.10.2018