Обновление объектов таблицы Azure с использованием API C# без перезаписи типов значений

Я не уверен, возможно ли это, но я пытаюсь использовать C# Azure Table API для обновления свойства в табличном хранилище, создав новый объект и объединив его:

// Create an object that only specifies the property to update
// (null properties are not updated)
var itemToUpdate = new TableEntity("PartitionKey", "RowKey");
itemToUpdate.DateLastAccessedUtc = DateTime.Now;
// can't do this!          
//itemToUpdate.DateCreatedUtc = null;

// Attach to the item, update it, and save the changes
_dataContext.AttachTo(_dataContext.TableName, itemToUpdate, "*");
_dataContext.UpdateObject(itemToUpdate);
_dataContext.SaveChanges();

По сути, я хочу обновить дату последнего доступа без обновления даты создания, но поскольку DateTimes не может иметь значение null, я не могу этого сделать. Можно ли сделать это, не делая два вызова к столу? Так как это будет вызываться часто, я не хочу получать объект перед его обновлением, если я могу избежать его.

1 ответ

Решение

Хотя это правда, что DateTime само по себе не может быть нулевым, если вы используете Nullable<DateTime> (или же DateTime? вместо этого вы можете установить эту дату на ноль (и клиентская библиотека хранилища понимает, что делать с Nullable<> типы. Это может не иметь смысла для других мест, где вы используете этот объект.

Если использование обнуляемого типа не имеет смысла, вы можете попробовать эту альтернативную идею (я не уверен, насколько это разумно, но я думаю, что это будет делать то, что вы хотите). Создать новый класс TableEntityJustLastAccessed который имеет обычный PartitionKey/RowKey/Timestamp свойства плюс только DateLastAccessedUtc свойство, которое вы хотите обновить.

В вашем коде обновления, а не создания TableEntity, создать TableEntityJustLastAccessed с тем же PartitionKey/RowKey и сохранить это. Поскольку по умолчанию клиентская библиотека хранилища объединяет изменения, а не переопределяет весь объект, она должна обновлять только то свойство, которое вам нужно.

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