2016-08-17 130 views
0

是否可以重構Azure表存儲使用的TableEntities?做重構就像當Azure存儲表和數據遷移

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

是否有可能維持值:

  • 重命名SomeIDSomeOtherID例如,請考慮下面的實體?
  • 將房產類型從string更改爲Guid? (考慮到所有現有的值都是實際的GUID)

如果是,那麼以一致的方式處理這些模式更改的推薦方法,如遷移EF6?

+0

是否要將實體的屬性名稱從'SomeID'更改爲'SomeOtherID',並在此過程中想要更改屬性類型?請解釋。 –

+0

@GauravMantri我試圖找到一種統一的方法來處理任何類型的架構修改。這些變化可能同時也可能不同步。 – Impworks

回答

1

您可以探索的其中一個選項是使用自定義EntityProperty解析器。

如果您更改類SomeOtherID屬性從SomeID的名稱並插入新的名稱表存儲實體,你將不得不在表存儲SomeID和/或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類型返回值時使用密鑰SomeIDSomeOtherID處理kvp。

您也可以使用相同的方式處理類型更改。插入新模式並更改屬性類型,當您將其讀回到您的EntityProperty解析器中處理這些模式。

我仍然建議將數據遷移到新的數據模型,而不是通過維護自定義的解析器。當您處於數據遷移過程中時,自定義解析程序可能會對您有所幫助,並且在您處於該過渡階段時仍然可以處理請求。

0

我不認爲有一種方法可以從Azure存儲架構執行此操作。你可以做的只是讀取實體並逐一更新它們(或者使用EntityGroupTransaction逐批更新)。