是否可以重构Azure Table Storage使用的TableEntities?例如,考虑以下实体:
class MyEntity: TableEntity
{
public string SomeID { get; set; }
}
进行如下重构时是否可以保持值:
将
SomeID
重命名为SomeOtherID
?将属性类型从
string
更改为Guid
? (考虑所有现有值均为实际的GUID)如果是,建议采用什么方法以一致的方式处理这些架构更改,例如EF6的迁移?
最佳答案
您可以探索的选项之一是使用自定义的EntityProperty
解析器。
如果将类中的属性名称从SomeID
更改为SomeOtherID
并将具有新名称的实体插入表存储,则表存储中将具有带有SomeID
和/或SomeOtherID
字段的实体。
当您向后查询时,您可以提供自定义的EntityProperty
解析程序委托,存储SDK将使用该委托从原始属性字典中创建您的具体实体类型。在该委托中,您可以放入逻辑来处理这种情况,以创建所需的实际类型。ExecuteQuery
中重载的CloudTable
方法采用EntityProperty
解析器:
public virtual IEnumerable<TResult> ExecuteQuery<TResult>(
TableQuery query,
EntityResolver<TResult> resolver,
TableRequestOptions requestOptions = null,
OperationContext operationContext = null
)
EntityProperty解析器是一个委托,您可以在其中决定如何从属性字典构造强类型实体:
public delegate T EntityResolver<T>(
string partitionKey,
string rowKey,
DateTimeOffset timestamp,
IDictionary<string, EntityProperty> properties,
string etag
);
因此,在此委托中,您在构造T型返回值时将代码放置为使用键
SomeID
和SomeOtherID
处理kvp。您也可以使用相同的方法来处理类型更改。插入新的架构和更改的属性类型,然后在读回时在
EntityProperty
解析器中进行处理。我仍然建议将数据迁移到新数据模型,而不是尽管维护自定义解析器。当您处于数据迁移过程的中间时,自定义解析器可能会为您提供帮助,而在此过渡阶段中,自定义解析器仍可以为请求提供服务。