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

时间:2015-05-18 07:07:09

标签: c# azure-storage azure-table-storage

这与我计划在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; }
}

并非所有属性都是必需的。记录的数量取决于用户将要保存的选择(例如,这是CarEntity - 如果用户订购了轮子,将填充属性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;
    }

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

https://msdn.microsoft.com/en-us/library/azure/hh452242.aspx #Remarks:

  

如果使用“插入或替换实体”操作来替换   实体,如果是,前一实体的任何属性都将被删除   新实体没有定义它们。具有空值的属性将   也被删除了。

另外,从你的代码

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

结果将包含TableOperation,而不是完整实体的副本,以防您满意。

这种情况可能是使用例如SQL表的区别,其中没有给出值的字段具有数据库默认值或默认为null,而Azure表模型中没有给出值的字段不存在。在读取/写入所选存储时,您只需要注意这种差异。

如果您要求将所有字段保留到表中,则为每个属性提供默认值,例如string.Empty

答案 2 :(得分:0)

如果字符串为null或为空,则根本不保存该属性。你没有做错任何事情,你只需要在设计中考虑这一点。

如果您正在使用TableEntity,那么它会为您执行null / empty检查。如果您正在使用DynamicTableEntity,那么您必须自己进行检查。