繁体   English   中英

Azure存储表和数据迁移

[英]Azure Storage Table and data migrations

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

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

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

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

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

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

如果将类中的属性名称从SomeIDSomeOtherID ,并将具有新名称的实体插入表存储,则表存储中将具有具有SomeID和/或SomeOtherID字段的实体。

当您向其查询时,您可以提供一个定制的EntityProperty Resolver委托,存储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型返回值时将代码使用SomeIDSomeOtherID键处理kvp。

您也可以使用相同的方法来处理类型更改。 插入新的架构和更改的属性类型,然后在读回时在EntityProperty解析器中进行处理。

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

我认为没有一种方法可以通过Azure存储体系结构来实现。 您可以做的只是读取实体并逐个更新实体(或使用EntityGroupTransaction逐批更新)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM