Azure 表存储:保存和检索复杂结构

问题描述 投票:0回答:1

我正在尝试在 Azure 表存储中存储一个复杂的对象。

我已经为我的实体实现了

ITableEntity
接口。

我也完成了

ReadEntity
WriteEntity
方法的实现。

您可以在下面看到示例实现。

我看到该对象在商店中保存为扁平对象。

但是,当我尝试检索该对象时,它仅返回一个包含

PartitionKey
、“RowKey”和
Timestamp
值的对象。

我想知道我在下面的实现中缺少什么,或者它是否正确,那么它是库中的错误吗?

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;

CloudStorageAccount _storageAccount;

CloudStorageAccount.TryParse("your-connection-string-to-storage-account", out _storageAccount);

var id = "2";

var vehicle = new VehicleDetails { PartitionKey = "Vehicle", RowKey = id, TitleId = id, 
Registration = new Registration { No = "234", Status = "Registered" } };


// add
var  client = _storageAccount.CreateCloudTableClient();
CloudTable table = client.GetTableReference(typeof(VehicleDetails).Name);
await table.ExecuteAsync(TableOperation.Insert(vehicle));

// fetch
var x = await table.ExecuteAsync(TableOperation.Retrieve<VehicleDetails>("Vehicle", vehicle.TitleId));
var d = (VehicleDetails)x.Result;

Console.WriteLine(d.Registration.No);


public class VehicleDetails : ITableEntity
{
   public string TitleId { get; set; } = default!;

   public Registration Registration { get; set; } = default!;
   public string PartitionKey { get; set; } = default!;
   public string RowKey { get; set; } = default!;
   public DateTimeOffset Timestamp { get; set; } = default!;
   public string ETag { get; set; } = default!;

   public void ReadEntity(IDictionary<string, EntityProperty> properties, OperationContext operationContext)
   {
     TableEntity.ConvertBack<VehicleDetails>(properties, operationContext);
   }

   public IDictionary<string, EntityProperty> WriteEntity(OperationContext operationContext)
   {
    return TableEntity.Flatten(this, operationContext);
   }
 }

 public class Registration
 {
   public string No { get; set; } = default!;
   public string Status { get; set; } = default!;

 }

更新代码

 var tableService = new TableServiceClient("your-connection-string-to-storage-account");
var tableClient = tableService.GetTableClient(typeof(VehicleDetails).Name);
var id = "4";
var vehicle = new VehicleDetails { PartitionKey = "Vehicle", RowKey = id, TitleId = id, Registration = new Registration { No = "234", Status = "Registered" } };

 // add
 var result = await tableClient.AddEntityAsync<VehicleDetails>(vehicle);

 // fetch
 var d = await tableClient.GetEntityAsync<VehicleDetails>(vehicle.PartitionKey, vehicle.RowKey);

  Console.WriteLine(d.Value.Registration.No);

 public class VehicleDetails : ITableEntity
 {

    public string TitleId { get; set; } = default!;

    public Registration Registration { get; set; } = default!;
    public string PartitionKey { get; set; } = default!;
    public string RowKey { get; set; } = default!;
    public DateTimeOffset? Timestamp { get; set; } = default!;
    public ETag ETag { get; set; } = default!;
  }

 public class Registration
{
   public string No { get; set; } = default!;
   public string Status { get; set; } = default!;

 }

添加实体时抛出错误/异常

c# azure azure-cosmosdb azure-table-storage
1个回答
0
投票

我会将注册作为字符串存储在表服务中:

public class VehicleDetails : ITableEntity
{
    public string TitleId { get; set; } = default!;
    public string Registration { get; set; } = default!;
    public string PartitionKey { get; set; } = default!;
    public string RowKey { get; set; } = default!;
    public DateTimeOffset? Timestamp { get; set; } = default!;
    public ETag ETag { get; set; } = default!;
}

然后:

    string registrationJson = JsonSerializer.Serialize(registration);

    var vehicle = new VehicleDetails
    {
        PartitionKey = "Vehicle",
        RowKey = id,
        TitleId = id,
        Registration = registrationJson
    };

检索,正好相反:

var retrievedVehicle = await tableClient.GetEntityAsync<VehicleDetails>(vehicle.PartitionKey, vehicle.RowKey);

Registration storedRegistration = JsonSerializer.Deserialize<Registration>(retrievedVehicle.Value.Registration);
© www.soinside.com 2019 - 2024. All rights reserved.