我有一个Record
和Name
的对象Theme
。
主题是嵌入在类型类中的KeyValue对,例如" 01" - " Sport"," 02" - " Home&#34 ;等
我有一个这样的对象:
public class DescriptionEntity : TableEntity
{
public string Description { get; set; }
public string Key { get { return RowKey; } set { RowKey = value; } }
public DescriptionEntity() { }
}
public class Theme : DescriptionEntity
{
}
/* The Record has a "string" and a "Theme" property */
public class Record : TableEntity
{
[...]
public string Name { get; set; }
public Theme Theme { get; set; }
}
问题是当我尝试从Azure表加载该记录时,如下所示:
var record = await repository.GetTableEntityAsync<Record>(id, RecordConst.RecordPartitionKey);
// ..........................
public async Task<T> GetTableEntityAsync<T>(string rowKey, string partitionKey) where T : ITableEntity, new()
{
var table = GetTable<T>();
TableQuery<T> query = new TableQuery<T>().Where(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey),
TableOperators.And,
TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, rowKey))).Take(1);
var result = new T();
TableContinuationToken continuationToken = null;
do
{
Task<TableQuerySegment<T>> querySegment = table.ExecuteQuerySegmentedAsync(query, continuationToken);
TableQuerySegment<T> segment = await querySegment;
result = segment.FirstOrDefault();
continuationToken = segment.ContinuationToken;
} while (continuationToken != null);
return result;
}
我获得record.Name
,但record.Theme
始终保持&#34; null&#34;,不会从&#34;记录&#34;表,就像:
Partition Key Name Theme
"record" "x" "test" "01"
也在我的主题&#34;我有桌子
Partition Key Description
"en" "01" "Sport"
我试图添加到&#34;主题&#34;对构造函数进行分类
public class Theme : DescriptionEntity
{
public Theme() : base() { }
public Theme(string key) : base(key) { }
}
但这并没有改变结果...
有没有办法明确说出&#34;取字符串&#34;主题&#34;并使用new Theme(string)
创建Theme
属性&#34;
答案 0 :(得分:1)
您可能已经知道Azure Tables是Key/Value
商店。但是要考虑的要点是Value
可以是以下预定义类型:String
,Int32
,Int64
,DateTimeOffset
,Double
,GUID
和Binary
。
在您的情况下,属性Theme
的值属于Theme
类型,它不是受支持的类型之一,因此Storage Client Library不会对其进行反序列化,因此您将获得{ {1}}值。
一种可能的解决方案是使用JSON序列化程序以字符串格式存储此属性的值,并在获取它时在应用程序中对其进行反序列化。
答案 1 :(得分:0)
我找到了一个“简单”的解决方案,可以使用string
代替Theme
作为Theme
属性的类型......
但我想知道是否有一些方法可以自定义控制从表格到对象的序列化/加载......
答案 2 :(得分:0)
Azure Table Storage Client SDK v8.0.0.0引入了对TableEntity类中使用2个新方法编写和读取具有复杂属性的复杂对象的支持。
要插入复杂对象,请按TableEntity.Flatten
方法展平它:
https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.table.tableentity.flatten?view=azurestorage-8.1.3
并将flatened对象插入到azure表存储中DynamicTableEntity
。
阅读完毕后,请使用TableEntity.ConvertBack<TypeOfYourComplexObject
&gt;
将展平实体转换为其原始复杂形式。 除了Collection和IEnumerable类型之外,还支持所有其他类型的属性complex,simple,class,struct,enum等
展平方法会将整个Record对象展平为扁平结构,因此在您的示例中,记录对象上的复杂Theme属性将展示为2个键值对,其对应名称为Theme_Description和Theme_Key。它们的值将是从其字符串值创建的EntityProperties。因此,一旦将记录对象写入表存储,您就可以单独访问(读取,投影,更新)此记录实体上的Theme_Description或Theme_Key属性。
您还可以查看我撰写的关于将复杂的多层次对象编写到azure表存储中的文章:https://doguarslan.wordpress.com/2016/02/03/writing-complex-objects-to-azure-table-storage/
除此之外,如果你想要一个自定义转换逻辑,即。从字符串Key属性到完整的Theme属性我建议您查看Retrieve
方法的重载版本,您可以在其中指定自定义EntityProperty转换器。
https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.table.tableoperation.retrieve?view=azurestorage-8.1.3#Microsoft_WindowsAzure_Storage_Table_TableOperation_Retrieve__1_System_String_System_String_Microsoft_WindowsAzure_Storage_Table_EntityResolver___0__System_Collections_Generic_List_System_String__