我正在尝试在 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!;
}
我会将注册作为字符串存储在表服务中:
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);