Azure.Data.Tables SDK中如何排除ITableEntity属性不持久化到Azure Table存储
针对Azure.Data.Tables版本忽略实体属性持久化的方案
Azure.Data.Tables SDK的实体序列化逻辑独立于JSON、XML序列化体系,因此JsonIgnore、XmlIgnore特性不会生效,可通过以下两种方案实现属性忽略:
方案1:使用官方专属忽略特性(推荐)
从Azure.Data.Tables v12.2.0版本开始,官方提供了专门的[IgnoreProperty]特性,直接标记到不需要持久化的属性上即可。
修改后的实体代码如下:
using Azure.Data.Tables; using System; public class AzTableEntity : ITableEntity { public AzTableEntity() { } public AzTableEntity(int length, byte[] bytes, string fileName) { RawBytes = bytes; Length = length; FileName = fileName; } // 标记该属性不参与Table存储的序列化、反序列化 [IgnoreProperty] public byte[] RawBytes { get; set; } public int Length { get; set; } public string FileName { get; set; } public string PartitionKey { get; set; } public string RowKey { get; set; } public DateTimeOffset? Timestamp { get; set; } public ETag ETag { get; set; } }
如果使用的是早于v12.2.0的Azure.Data.Tables版本,替换为System.Runtime.Serialization命名空间下的[IgnoreDataMember]特性即可生效。
方案2:手动实现实体序列化逻辑
如果需要更灵活的属性控制,可以手动实现ITableEntity接口的WriteEntity和ReadEntity方法,主动过滤不需要的属性:
using Azure.Data.Tables; using System; using System.Collections.Generic; public class AzTableEntity : ITableEntity { public AzTableEntity() { } public AzTableEntity(int length, byte[] bytes, string fileName) { RawBytes = bytes; Length = length; FileName = fileName; } public byte[] RawBytes { get; set; } public int Length { get; set; } public string FileName { get; set; } public string PartitionKey { get; set; } public string RowKey { get; set; } public DateTimeOffset? Timestamp { get; set; } public ETag ETag { get; set; } // 序列化时仅返回需要持久化的属性 public IDictionary<string, object> WriteEntity(CancellationToken cancellationToken = default) { return new Dictionary<string, object> { { nameof(Length), Length }, { nameof(FileName), FileName }, { nameof(PartitionKey), PartitionKey }, { nameof(RowKey), RowKey } }; } // 反序列化时仅给需要的属性赋值 public void ReadEntity(IDictionary<string, object> properties, CancellationToken cancellationToken = default) { Length = properties.TryGetValue(nameof(Length), out var lenVal) ? (int)lenVal : default; FileName = properties.TryGetValue(nameof(FileName), out var nameVal) ? (string)nameVal : default; PartitionKey = properties.TryGetValue(nameof(PartitionKey), out var pkVal) ? (string)pkVal : default; RowKey = properties.TryGetValue(nameof(RowKey), out var rkVal) ? (string)rkVal : default; Timestamp = properties.TryGetValue(nameof(Timestamp), out var tsVal) ? (DateTimeOffset?)tsVal : default; ETag = properties.TryGetValue(nameof(ETag), out var etVal) ? (ETag)etVal : default; } }
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

