使用Azure.Data.Tables操作Azure Table Storage时如何忽略TableEntity指定属性
Azure.Data.Tables 忽略指定属性持久化的实现方案
新版 Azure.Data.Tables 库没有沿用旧版的 [IgnoreProperty] 特性,可通过以下两种方案实现属性忽略:
方案1:使用[IgnoreDataMember]特性(优先推荐)
该特性属于 System.Runtime.Serialization 命名空间,直接标记到不需要写入表存储的属性上即可,是最简单的实现方式。
修改后的实体类代码如下:
using System.Runtime.Serialization; // 需引入该命名空间 using Azure.Data.Tables; using System.Drawing; // 对应Point类型的命名空间,按需调整 public class MySpatialEntity : ITableEntity { public int ObjectId { get; set; } public string Name { get; set; } public int MonitoringArea { get; set; } // 标记该属性序列化时忽略 [IgnoreDataMember] public Point Geometry { get; set; } // ITableEntity接口成员 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; } }
方案2:自定义序列化逻辑(适合复杂场景)
如果存在动态忽略规则、多属性批量处理等特殊需求,可以通过重写 ITableEntity 的 WriteEntity 方法手动过滤不需要的属性,同时可配套重写 ReadEntity 方法处理反序列化逻辑,示例如下:
public class MySpatialEntity : ITableEntity { public int ObjectId { get; set; } public string Name { get; set; } public int MonitoringArea { get; set; } public Point Geometry { get; set; } 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; } // 自定义序列化逻辑,过滤Geometry属性 public IDictionary<string, object> WriteEntity() { return new Dictionary<string, object> { { nameof(ObjectId), ObjectId }, { nameof(Name), Name }, { nameof(MonitoringArea), MonitoringArea }, { nameof(PartitionKey), PartitionKey }, { nameof(RowKey), RowKey } // 不添加Geometry属性即可实现忽略 }; } // 自定义反序列化逻辑 public void ReadEntity(IDictionary<string, object> properties) { ObjectId = properties.TryGetValue(nameof(ObjectId), out var oid) ? (int)oid : default; Name = properties.TryGetValue(nameof(Name), out var name) ? (string)name : default; MonitoringArea = properties.TryGetValue(nameof(MonitoringArea), out var area) ? (int)area : default; Timestamp = properties.TryGetValue(nameof(Timestamp), out var ts) ? (DateTimeOffset?)ts : default; ETag = properties.TryGetValue(nameof(ETag), out var etag) ? new ETag((string)etag) : default; } }
两种方案均可实现属性不被写入Azure Table Storage,常规场景下直接使用[IgnoreDataMember]即可满足需求。
内容的提问来源于stack exchange,提问作者paddingtonMike
相关产品推荐
相关产品推荐

