Azure存储表和数据迁移

时间:2016-08-17 08:45:32

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

是否可以重构Azure Table Storage使用的TableEntities?例如,请考虑以下实体:

class MyEntity: TableEntity
{
    public string SomeID { get; set; }
}

在进行重构时是否可以保持值:

  • SomeID重命名为SomeOtherID
  • 将属性类型从string更改为Guid? (考虑到所有现有值都是实际的GUID)

如果是,那么以一致的方式处理这些架构更改的建议方法是什么,例如EF6的迁移?

2 个答案:

答案 0 :(得分:2)

您可以探索的其中一个选项是使用自定义SomeID解析程序。

如果您将班级中的媒体资源名称从SomeOtherID更改为SomeID并将具有新名称的实体插入到表存储中,您将拥有SomeOtherID和/的实体或表存储中的EntityProperty个字段。

当您查询它们时,您可以提供自定义ExecuteQuery解析程序委托,存储SDK将使用该委托来从原始属性字典中创建您的具体实体类型。在该委托中,您可以输入逻辑来处理此方案以创建所需的实际类型。

CloudTable中的重载EntityProperty方法需要public virtual IEnumerable<TResult> ExecuteQuery<TResult>( TableQuery query, EntityResolver<TResult> resolver, TableRequestOptions requestOptions = null, OperationContext operationContext = null ) 解析器:

public delegate T EntityResolver<T>(
    string partitionKey,
    string rowKey,
    DateTimeOffset timestamp,
    IDictionary<string, EntityProperty> properties,
    string etag
);

EntityProperty解析器是一个委托,您可以在其中决定如何从属性字典构建强类型实体:

SomeID

因此,在此委托中,您在构造T类型返回值时,使用密钥SomeOtherIDEntityProperty来处理kvp s代码。

您也可以使用相同的方法来处理类型更改。使用新架构和更改的属性类型插入,当您将其读回时,请在34.123456789 -> 34.123 34.000000000 -> 34 not 34.000 解析器中处理这些内容。

我仍然建议将数据迁移到新数据模型,而不是维护自定义解析器。当您处于数据迁移过程中时,自定义解析程序可以帮助您,并且在您处于过渡阶段时仍然可以处理请求。

答案 1 :(得分:0)

我认为从Azure存储架构中无法实现此目的。你可以做的只是读取实体并逐个更新它们(或使用EntityGroupTransaction批量更新)。