使用C#API更新Azure表实体而不覆盖值类型

时间:2011-03-14 22:31:57

标签: c# azure azure-storage azure-table-storage

我不确定这是否可行,但我正在尝试使用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 个答案:

答案 0 :(得分:1)

虽然DateTime本身不能为空,但如果您使用Nullable<DateTime>(或DateTime?,如果您愿意),那么您可以设置该日期为null(并且Storage Client Library了解如何处理Nullable<>类型。但这对于您正在使用此对象的其他位置可能没有意义。

如果使用可空类型没有意义,你可以尝试这个替代想法(我不确定这是多么明智,但我认为它会做你想要的)。创建一个新类TableEntityJustLastAccessed,其中包含通常的PartitionKey / RowKey / Timestamp属性以及您要更新的DateLastAccessedUtc属性。

在您的更新代码中,不是创建TableEntity,而是使用相同的TableEntityJustLastAccessed / PartitionKey创建RowKey并保存。{p>因为默认情况下存储客户端库合并更改而不是覆盖整个对象,所以它应该只更新您关注的属性。