Я использую Entity Framework с шаблонами Self-Tracking Entity T4, которые по умолчанию генерируют SQL-запрос, устанавливающий все свойства Entity в операторе UPDATE. Мне нужен только оператор UPDATE, содержащий измененные свойства.
Я изменил шаблон T4, как указано в книге: Рецепты Entity Framework: Подход «проблема-решение» стр. 503.
Я изменил эту строку в шаблоне T4:
OriginalValueMembers originalValueMembers = new OriginalValueMembers(false, metadataWorkspace, ef);
Заставить объект отслеживать каждое изменение свойства, а не просто отслеживать изменение объекта.
А также
context.ObjectStateManager.ChangeObjectState(entity, EntityState.Unchanged);
] После внесения этих изменений я получил желаемый результат оператора SQL только с измененными значениями / свойствами в операторе UPDATE. Однако был странный побочный эффект. При обновлении свойства INT, допускающего значение NULL, с NULL на значение, отличное от NULL, изменение этого свойства игнорировалось Entity Framework. Модели с самотслеживанием показывают изменение в ChangeTracker с точным значением OriginalValue null, но когда Entity Framework попыталась сгенерировать UPDATE SQL, это свойство не изменилось, если исходное значение null и новое значение не равно null. Я работал, если исходное значение не было нулевым и значение менялось.
Кажется, все нормально работает со строковым свойством, переходящим от нулевого значения к ненулевому, но int? не работает.
У кого-нибудь есть идеи?