Вызов 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.GetChanges - MSDN

Получает копию объекта DataTable, содержащего все изменения, внесенные в него с момента его последней загрузки или после вызова AcceptChanges, отфильтрованные с помощью DataRowState.

Также см:

Состояния строк и версии строк - MSDN

ADO.NET управляет строками в таблицах, используя состояния и версии строк. Состояние строки указывает на состояние строки; Версии строк сохраняют значения, хранящиеся в строке при ее изменении, включая текущие, исходные значения и значения по умолчанию. Например, после внесения изменений в столбец в строке строка будет иметь состояние строки "Изменено" и две версии строки: "Текущая", которая содержит текущие значения строки, и "Исходная", которая содержит значения строки до столбец был изменен.

Это, очевидно, особенность дизайна, так как даже вызов SetField() метод расширения с точно таким же объектом, а затем проверка значений поля в DataRowVersion.Original а также DataRowVersion.Current Вы можете обнаружить, что они все еще равны. Нет документации, описывающей другое поведение.

Другие вопросы по тегам