2012-02-09 32 views
0

我今天將子對象存儲在azure表存儲中時有點失效。 有點像Person.Project,其中Person是表實體,Person只是一個POCO。我能夠實現這一目標的唯一方法是將項目序列化爲byte []。這可能是需要的,但還有其他方法嗎?在Azure表存儲器中存儲子對象的首選方法

感謝 拉斯穆斯

回答

0

儘管在原始問題上,您當然可以將父母和孩子存儲在同一張表中 - 嘗試這樣做時是否看到錯誤?

通過將父母和子女分隔爲單獨的表格而犧牲的另一件事是將更新分組到事務中的能力。假設你爲這個人創建了一個新的「人物」併爲其添加了許多項目,如果他們在同一個分區關鍵表中,你可以將多個插入作爲一個原子操作發送。使用多表方法,您必須自己管理原子性(如果這是您的數據一致性模型的要求)。

+0

你碰巧有一個如何做到這一點以外的一個更好的例子:http://msdn.microsoft.com/ EN-US /庫/ ff803373.aspx#sec19。這似乎過於複雜恕我直言。 – s1mm0t 2012-02-20 16:19:57

0

我假定當你說人僅僅是一個POCO你的意思項目僅僅是一個POCO?

我的首選方法是將子對象存儲在其自己的Azure表中,並使用與父項相同的分區鍵和行鍵。主要原因是,如果必須的話,這允許您對這個子對象運行查詢。您不能只運行一個使用來自父代和子代的屬性的查詢,但至少可以針對子實體運行查詢。另一個優點是這意味着子類可以佔用更多的空間,可以存儲在單個屬性中的數據量的限制小於可以存儲在一行中的數量。

如果這些事情都不是你的問題,那麼你所做的是完全可以接受的。

1

就我個人而言,我寧願將項目存儲在不同的表中,使用與其父項相同的分區鍵,這是其人員的分區鍵。它確保人員和基礎項目將存儲在同一個存儲羣集中。在代碼方面,我想在引用屬性的頂部有一些屬性,例如[Reference(typeof(Person))]和[Collection(typeof(Project))],並且在我可以使用的數據上下文類中一些擴展方法,它根據需要檢索子元素。

0

我遇到過類似的問題,並實現了一個通用對象拼合/重組API,將您的複雜實體扁平化爲平面EntityProperty字典,並以DynamicTableEntity的形式使它們可寫入表存儲。

然後,相同的API將從DynamicTableEntityEntityProperty字典中重新構造整個複雜對象。

看一看:https://www.nuget.org/packages/ObjectFlattenerRecomposer/

用法:

//Flatten complex object (of type ie. Order) and convert it to EntityProperty Dictionary 
Dictionary<string, EntityProperty> flattenedProperties = EntityPropertyConverter.Flatten(order); 

// Create a DynamicTableEntity and set its PK and RK 
DynamicTableEntity dynamicTableEntity = new DynamicTableEntity(partitionKey, rowKey); 
dynamicTableEntity.Properties = flattenedProperties; 

// Write the DynamicTableEntity to Azure Table Storage using client SDK 

//Read the entity back from AzureTableStorage as DynamicTableEntity using the same PK and RK 
DynamicTableEntity entity = [Read from Azure using the PK and RK]; 

//Convert the DynamicTableEntity back to original complex object. 
Order order = EntityPropertyConverter.ConvertBack<Order>(entity.Properties);