Azure表未将属性加载到对象

时间:2017-07-24 09:32:13

标签: azure asp.net-core azure-table-storage asp.net-core-1.1 azure-tablequery

我有一个RecordName的对象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;

3 个答案:

答案 0 :(得分:1)

您可能已经知道Azure Tables是Key/Value商店。但是要考虑的要点是Value可以是以下预定义类型:StringInt32Int64DateTimeOffsetDoubleGUIDBinary

在您的情况下,属性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;

https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.table.tableentity.convertback?view=azurestorage-8.1.3#Microsoft_WindowsAzure_Storage_Table_TableEntity_ConvertBack__1_System_Collections_Generic_IDictionary_System_String_Microsoft_WindowsAzure_Storage_Table_EntityProperty__Microsoft_WindowsAzure_Storage_OperationContext_

将展平实体转换为其原始复杂形式。 除了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__