Azure表存储不保存属性

时间:2017-11-30 07:02:00

标签: c# azure azure-table-storage

我有一个继承自Table Entity的抽象类。

public abstract class AzureEntityBase : TableEntity
{
    public AzureEntityBase()
    {

    }
    public virtual string TableName
    {
        get
        {
            return string.Empty;
        }
    }
    private string ObjectHash { get; set; }

    public bool IsBackedUp { get; set; }

}

然后我有一个实现这个抽象类的类

public class DepartmentTotalEntity : AzureEntityBase
{
    public override string TableName
    {
        get
        {
            return "DepartmentTotals";
        }
    }
    public Int64 SessionDateTimeInteger { get; set; }
    public string StoreID { get { return PartitionKey; } set { PartitionKey = value; } }
    public string DetailKey { get; set; }
    public string RangeString { get; set; }
    public string DateStart { get; set; }
    public string DateEnd { get; set; }
    public Int64 DateStartInt { get; set; }
    public Int64 DateEndInt { get; set; }
    public string Dept_ID { get; set; }
    public string DepartmentDescription { get; set; }                
    public decimal Quantity { get; set; }
    public decimal TotalPrice { get; set; }        
}

我将修改后的实体提交到Azure表存储,并将IsBackedUp值设置为false。 然后,我有一个在Azure Compute实例上运行的服务,该实例将行从一个表存储帐户复制到另一个表存储帐户。另一个Azure表存储帐户位于不同的Azure数据中心。在复制了所有行之后,我想限制我在复制下一轮时所抓取的内容,并且IsBackedUp字段应该这样做。

我运行一个循环已经插入的行的函数,检查它们是否存在于目标中,如果它们存在,则更新源表行以反映它已备份并通过以下内容写入azure代码。

   foreach (DepartmentTotalEntity row in CopiedRows)
       {
           DepartmentTotalEntity find = dst.BrowseSingle(row.PartitionKey, row.RowKey);
           if (find != null)
           {
               row.IsBackedUp = true;
               int tmp = src.InsertOrReplace(row);
            }
       }

InsertOrReplace的返回整数是tableoperation的HttpStatusCode,它总是读取204.这对于成功写入ATS是可取的。

为了完整性,这里是InsertOrReplaceRow函数。

public int InsertOrReplace(DepartmentTotalEntity input)
        {
            if (input.PartitionKey.IsNull())
            {
                throw new ArgumentNullException("PartitionKey");
            }
            if (input.RowKey.IsNull())
            {
                throw new ArgumentNullException("RowKey");
            }

            TableOperation replaceOperation = TableOperation.InsertOrReplace(input);
            TableResult result = table.Execute(replaceOperation);
            return result.HttpStatusCode;
        }

主要问题是在第三个代码块中调用InsertOrReplace命令时,IsBackedUp字段没有被更新。

在这里试着弄清楚为什么ATS不会接受我的修改。

我可以使用Azure Table Storage Explorer成功更改IsBackedUp的值。我已经确认该列的数据类型是布尔值。

非常感谢任何帮助。如果我已经发布了足够的代码来帮助我,请告诉我。唯一没有发布的类是围绕最后一个代码块的类的其余部分。它超过2000行,所以为了简洁我省略了它。该类具有CloudTable,CloudTableClient和CloudStorageAccount变量。

0 个答案:

没有答案