我不确定这是否可行,但我正在尝试使用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,我不能这样做。是否可以在不对表进行两次调用的情况下执行此操作?由于这将被频繁调用,我不想在更新之前检索对象,如果我可以避免它。
答案 0 :(得分:1)
虽然DateTime
本身不能为空,但如果您使用Nullable<DateTime>
(或DateTime?
,如果您愿意),那么您可以设置该日期为null(并且Storage Client Library了解如何处理Nullable<>
类型。但这对于您正在使用此对象的其他位置可能没有意义。
如果使用可空类型没有意义,你可以尝试这个替代想法(我不确定这是多么明智,但我认为它会做你想要的)。创建一个新类TableEntityJustLastAccessed
,其中包含通常的PartitionKey
/ RowKey
/ Timestamp
属性以及您要更新的DateLastAccessedUtc
属性。
在您的更新代码中,不是创建TableEntity
,而是使用相同的TableEntityJustLastAccessed
/ PartitionKey
创建RowKey
并保存。{p>因为默认情况下存储客户端库合并更改而不是覆盖整个对象,所以它应该只更新您关注的属性。