Azure表存储不会在实体定义中保存所有内容

本文关键字:保存 定义 实体 存储 Azure | 更新日期: 2023-09-27 17:49:35

这与我计划在Azure表存储(ATS)中保存的实体相同:

public class CarEntity : TableEntity
{
    public CarEntity(string objPartitionKey, string objRowKey)
    {
        this.PartitionKey = objPartitionKey;
        this.RowKey = objRowKey;
    }
    public string TableName
    {
        get { return "EntityTableName"; }
    }
    public string Property1 { get; set; }
    // and this goes on
    public string Property60 { get; set; }
}

不是所有的属性都是必需的。记录的填充取决于用户要保存的选择(例如,这是一个实体-如果用户订购车轮,则填充属性WheelSize和WheelQuantity,如果用户要求重新绘制,则填充RepaintingColor,等等)。

假设在这个实体中有60个属性,并不是所有的属性都保存在ATS中。尽管定义了属性并且没有返回错误,但该数据不会保存在表中。我知道每个实体有1MB的限制,但考虑到我们所做的计算,它离1MB的限制有点远。

任何帮助为什么列不出现,即使属性被相应地保存?我的保存函数定义如下:

    public static CarEntity CarInsertOrReplace(CarEntity entity)        
    {
        if (entity == null)
        {
            throw new ArgumentNullException("entity");
        }
        var table = SetupTable(entity.TableName);
        table.CreateIfNotExists();
        TableOperation insertOrMergeOperation = TableOperation.InsertOrReplace(entity);
        TableResult result = table.Execute(insertOrMergeOperation);
        CarEntity objEntity = result.Result as CarEntity;
        return objEntity;
    }

Azure表存储不会在实体定义中保存所有内容

听起来实体的属性根据使用情况而变化。可能发生的情况是,Azure表存储仅为非空(具有值集)的属性创建列。因此,您将只能看到为已设置的属性创建的列。

听起来好像表存储正在按照您的要求执行,但不一定像您期望的那样。正如@Paul Fryer所回答的那样,ATS不会存储空值,并且因为您没有(通过引用的代码)初始化CarEntity属性,默认情况下它们将为空。因此,只有用户设置的属性才会保存到表中。

https://msdn.microsoft.com/en-us/library/azure/hh452242.aspx备注:

如果使用"插入或替换实体"操作替换实体,则前一个实体中的任何属性都将被删除新实体没有定义它们。具有空值的属性将

同样,从你的代码

TableResult result = table.Execute(insertOrMergeOperation);
CarEntity objEntity = result.Result as CarEntity;

result将包含TableOperation而不是完整实体的副本,如果这是您所期望的。

此场景可能是使用以下两种情况的区别:例如,SQL表中未给定值的字段具有数据库默认值或默认值为null,而Azure表模型中未给定值的字段不存在。你只需要在读/写所选择的存储时意识到这种差异。

如果你需要将所有字段持久化到表中,那么为每个属性提供一个默认值,例如string。空

如果字符串为null或空,则根本不保存该属性。你并没有做错什么,你只是需要在你的设计中考虑到这一点。

如果你使用TableEntity,那么它会为你做null/empty检查。如果你使用DynamicTableEntity,那么你必须自己做检查。