Azure 存储 Table 和数据迁移

Azure Storage Table and data migrations

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

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

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

如果是,以一致的方式处理这些模式更改的推荐方法是什么,例如 EF6 的迁移?

我认为没有办法从 Azure 存储架构中做到这一点。您可以做的只是读取实体并逐个更新它们(或使用 EntityGroupTransaction 逐批更新)。

您可以探索的选项之一是使用自定义 EntityProperty 解析器。

如果您将 class 中的 属性 的名称从 SomeID 更改为 SomeOtherID 并将具有新名称的实体插入到 table存储,您将在 table 存储中拥有具有 SomeID and/or SomeOtherID 字段的实体。

当您查询它们时,您可以提供自定义 EntityProperty 解析器委托,存储 SDK 将使用它从原始 属性 字典创建您的具体实体类型。在该委托中,您可以放入逻辑来处理这种情况,以创建您想要的实际类型。

CloudTable 中重载的 ExecuteQuery 方法采用 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 类型 return 值时放置代码来处理带有键 SomeIDSomeOtherID 的 kvp s。

您也可以使用相同的方法来处理类型更改。插入新模式并更改 属性 类型,当你读回它时在你的 EntityProperty 解析器中处理这些。

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