1

我正在尝试使用批处理选项将实体保存在 azure 存储表中

这是代码:

foreach (TableEntity entity in entitiesList)
{
     ServiceContext.AddObject(entity.getTableName(), entity);
}

ServiceContext.SaveChangesWithRetries(SaveChangesOptions.Batch);

我收到了这个异常:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <code>InvalidInput</code>
  <message xml:lang="en-US">99:One of the request inputs is not valid.
RequestId:b54a78fe-30ae-427e-86e9-6107d6e3fe5a
Time:2013-01-14T15:50:17.0134794Z</message>
</error>

但是当我尝试在单独的查询中添加每个实体时,它可以工作

但我不明白的是,当我使用“Azure 存储资源管理器”检查 azure sotage 帐户上的表时,我发现了我正在尝试加载的数据!

谁能解释为什么我在 azure 表上找到了数据,尽管我有一个异常,以及如何修复它,以便将批处理选项与 ServiceContext.SaveChangesWithRetries 方法一起使用

在此先感谢您的帮助

4

2 回答 2

2

Batch 选项仅支持添加最多 100 个只有一个 PartitionKey 的实体。请确保您保存的实体不超过 100 个并且都包含一个密钥。

请在此处找到有关批量实体事务的更多信息:http: //msdn.microsoft.com/en-us/library/windowsazure/dd894038.aspx

于 2013-01-14T17:14:07.603 回答
1

99:其中一个请求输入无效。

上述消息中的 99 表示您的批次中的第 100 个实体存在错误(索引从 0 开始)。您可以检查的几件事:

  1. 确保实体数据正确。
  2. 由于您正在执行“添加”操作,因此请确保该实体不存在。除了“添加”操作,您还可以尝试插入或替换实体插入或合并实体操作。

看看下面的代码:

public class CustomerEntity : TableServiceEntity
{
    public CustomerEntity()
    {
        PartitionKey = "Customer";
        RowKey = Guid.NewGuid().ToString();
    }

    public string FirstName
    {
        get;
        set;
    }

    public string LastName
    {
        get;
        set;
    }

    public DateTime? LastOrderDate
    {
        get;
        set;
    }
}


    static void InsertEntityBatchOperation()
    {
        var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
        var cloudTableClient = storageAccount.CreateCloudTableClient();

        var customer = new CustomerEntity()
        {
            FirstName = "John",
            LastName = "Smith",
            LastOrderDate = DateTime.UtcNow.Date.AddDays(-10)
        };
        var serviceContext = cloudTableClient.GetDataServiceContext();
        serviceContext.AddObject(tableName, customer);
        customer = new CustomerEntity()
        {
            FirstName = "Jane",
            LastName = "Smith",
            LastOrderDate = DateTime.UtcNow.Date.AddDays(-5)
        };
        serviceContext.AttachTo(tableName, customer, null);
        serviceContext.UpdateObject(customer);
        customer = new CustomerEntity()
        {
            FirstName = "John",
            LastName = "Doe",
            LastOrderDate = DateTime.UtcNow.Date.AddDays(-7)
        };
        serviceContext.AttachTo(tableName, customer, null);
        serviceContext.UpdateObject(customer);
        customer = new CustomerEntity()
        {
            FirstName = "Jane",
            LastName = "Doe",
            LastOrderDate = DateTime.UtcNow.Date.AddDays(-3)
        };
        serviceContext.AttachTo(tableName, customer, null);
        serviceContext.UpdateObject(customer);
        //Following will perform Insert Or Merge Entity Operation
        serviceContext.SaveChangesWithRetries(SaveChangesOptions.Batch);
        //Following will perform Insert Or Replace Entity Operation
        serviceContext.SaveChangesWithRetries(SaveChangesOptions.Batch | SaveChangesOptions.ReplaceOnUpdate);
    }
于 2013-01-14T17:46:31.070 回答