You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:24:05