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 问题讨论了这个问题:

您可以做的是为要保留在实体中的属性创建一个自定义字典,并将该字典用于 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