Azure Table 存储:使用 Azure.Data.Tables 包时忽略 Table 实体的 属性
Azure Table Storage: Ignoring a property of a TableEntity when using the Azure.Data.Tables package
我正在使用 Microsoft 的新 Azure.Data.Tables 库来处理 Azure Table 存储。对于旧库,当您有一个实现 ITableEntity 的实体并且您有一个不想保存到存储 table 的 属性 时,您将使用 [IgnoreProperty] 注释.不过这个在新库上好像没有。
Azure.Data.Tables 包上的等效项是什么,或者您现在如何避免将 属性 保存到 table 存储空间?
这就是我要坚持的class:
public class MySpatialEntity : ITableEntity
{
public int ObjectId { get; set; }
public string Name { get; set; }
public int MonitoringArea { get; set; }
//This is the property I want to ignore because table storage cannot store it
public Point Geometry { get; set; }
//ITableEntity Members
public virtual string PartitionKey { get => MonitoringArea.ToString(); set => MonitoringArea = int.Parse(value); }
public virtual string RowKey { get => ObjectId.ToString(); set => ObjectId = int.Parse(value); }
public DateTimeOffset? Timestamp { get; set; }
public ETag ETag { get; set; }
}
我认为目前没有像 [IgnoreProperty]
这样的东西可用(至少 version 12.1.0
是这样)。
我发现有两个 Github 问题讨论了这个问题:
- https://github.com/Azure/azure-sdk-for-net/issues/19782
- https://github.com/Azure/azure-sdk-for-net/issues/15383
您可以做的是为要保留在实体中的属性创建一个自定义字典,并将该字典用于 add/update 操作。
请参阅下面的示例代码:
using System;
using System.Collections.Generic;
using System.Drawing;
using Azure;
using Azure.Data.Tables;
namespace SO68633776
{
class Program
{
private static string connectionString = "connection-string";
private static string tableName = "table-name";
static void Main(string[] args)
{
MySpatialEntity mySpatialEntity = new MySpatialEntity()
{
ObjectId = 1,
Name = "Some Value",
MonitoringArea = 2
};
TableEntity entity = new TableEntity(mySpatialEntity.ToDictionary());
TableClient tableClient = new TableClient(connectionString, tableName);
var result = tableClient.AddEntity(entity);
}
}
public class MySpatialEntity: ITableEntity
{
public int ObjectId { get; set; }
public string Name { get; set; }
public int MonitoringArea { get; set; }
//This is the property I want to ignore because table storage cannot store it
public Point Geometry { get; set; }
//ITableEntity Members
public virtual string PartitionKey { get => MonitoringArea.ToString(); set => MonitoringArea = int.Parse(value); }
public virtual string RowKey { get => ObjectId.ToString(); set => ObjectId = int.Parse(value); }
public DateTimeOffset? Timestamp { get; set; }
public ETag ETag { get; set; }
public IDictionary<string, object> ToDictionary()
{
return new Dictionary<string, object>()
{
{"PartitionKey", PartitionKey},
{"RowKey", RowKey},
{"ObjectId", ObjectId},
{"Name", Name},
{"MonitoringArea", MonitoringArea}
};
}
}
}
从版本 12.2.0.beta.1 开始,Azure.Data.Tables table 实体模型现在支持通过 [IgnoreDataMember]
属性在序列化期间忽略属性并通过 [DataMember(Name="<yourNameHere>")]
属性。
查看更新日志 here。
我正在使用 Microsoft 的新 Azure.Data.Tables 库来处理 Azure Table 存储。对于旧库,当您有一个实现 ITableEntity 的实体并且您有一个不想保存到存储 table 的 属性 时,您将使用 [IgnoreProperty] 注释.不过这个在新库上好像没有。
Azure.Data.Tables 包上的等效项是什么,或者您现在如何避免将 属性 保存到 table 存储空间?
这就是我要坚持的class:
public class MySpatialEntity : ITableEntity
{
public int ObjectId { get; set; }
public string Name { get; set; }
public int MonitoringArea { get; set; }
//This is the property I want to ignore because table storage cannot store it
public Point Geometry { get; set; }
//ITableEntity Members
public virtual string PartitionKey { get => MonitoringArea.ToString(); set => MonitoringArea = int.Parse(value); }
public virtual string RowKey { get => ObjectId.ToString(); set => ObjectId = int.Parse(value); }
public DateTimeOffset? Timestamp { get; set; }
public ETag ETag { get; set; }
}
我认为目前没有像 [IgnoreProperty]
这样的东西可用(至少 version 12.1.0
是这样)。
我发现有两个 Github 问题讨论了这个问题:
- https://github.com/Azure/azure-sdk-for-net/issues/19782
- https://github.com/Azure/azure-sdk-for-net/issues/15383
您可以做的是为要保留在实体中的属性创建一个自定义字典,并将该字典用于 add/update 操作。
请参阅下面的示例代码:
using System;
using System.Collections.Generic;
using System.Drawing;
using Azure;
using Azure.Data.Tables;
namespace SO68633776
{
class Program
{
private static string connectionString = "connection-string";
private static string tableName = "table-name";
static void Main(string[] args)
{
MySpatialEntity mySpatialEntity = new MySpatialEntity()
{
ObjectId = 1,
Name = "Some Value",
MonitoringArea = 2
};
TableEntity entity = new TableEntity(mySpatialEntity.ToDictionary());
TableClient tableClient = new TableClient(connectionString, tableName);
var result = tableClient.AddEntity(entity);
}
}
public class MySpatialEntity: ITableEntity
{
public int ObjectId { get; set; }
public string Name { get; set; }
public int MonitoringArea { get; set; }
//This is the property I want to ignore because table storage cannot store it
public Point Geometry { get; set; }
//ITableEntity Members
public virtual string PartitionKey { get => MonitoringArea.ToString(); set => MonitoringArea = int.Parse(value); }
public virtual string RowKey { get => ObjectId.ToString(); set => ObjectId = int.Parse(value); }
public DateTimeOffset? Timestamp { get; set; }
public ETag ETag { get; set; }
public IDictionary<string, object> ToDictionary()
{
return new Dictionary<string, object>()
{
{"PartitionKey", PartitionKey},
{"RowKey", RowKey},
{"ObjectId", ObjectId},
{"Name", Name},
{"MonitoringArea", MonitoringArea}
};
}
}
}
从版本 12.2.0.beta.1 开始,Azure.Data.Tables table 实体模型现在支持通过 [IgnoreDataMember]
属性在序列化期间忽略属性并通过 [DataMember(Name="<yourNameHere>")]
属性。
查看更新日志 here。