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