Вызов SetField для DataRow с тем же значением вызывает изменения?
Несколько запутанный здесь, следующий код вызывает изменения в DataTable, когда я не ожидал, что это произойдет. Нет ли фактического индивидуального управления изменениями значений внутри DataTable? Или я что-то упустил?
var table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Rows.Add("Sample Name");
table.AcceptChanges();
table.Rows[0].SetField("Name", "Sample Name");
var changes = table.GetChanges();
// expecting null, actually returns changes
Я ожидал бы, что внутренне таблица будет использовать некоторую предварительно созданную логику, чтобы определить, действительно ли новое значение отличается от текущего значения.
Почему так сделано?
2 ответа
Когда вы изменяете содержимое строки, он обновляет DataRow.RowState
свойство, которое может содержать UnChanged
, Added
, Modified
и т. д. позже DataTable.GetChanges
отфильтровать строки на основе этого статуса строки. Это независимо от стоимости.
Получает копию объекта DataTable, содержащего все изменения, внесенные в него с момента его последней загрузки или после вызова AcceptChanges, отфильтрованные с помощью DataRowState.
Также см:
Состояния строк и версии строк - MSDN
ADO.NET управляет строками в таблицах, используя состояния и версии строк. Состояние строки указывает на состояние строки; Версии строк сохраняют значения, хранящиеся в строке при ее изменении, включая текущие, исходные значения и значения по умолчанию. Например, после внесения изменений в столбец в строке строка будет иметь состояние строки "Изменено" и две версии строки: "Текущая", которая содержит текущие значения строки, и "Исходная", которая содержит значения строки до столбец был изменен.
Это, очевидно, особенность дизайна, так как даже вызов SetField()
метод расширения с точно таким же объектом, а затем проверка значений поля в DataRowVersion.Original
а также DataRowVersion.Current
Вы можете обнаружить, что они все еще равны. Нет документации, описывающей другое поведение.