在Azure Table存储上调用Execute语句以获取现有数据(在填充数据之前检查数据是否存在),我收到一条错误消息"元数据URI' https://my.azure.table.core.windows.net/ $元数据#MyTable的/ @元素'对于预期的有效负载类型'条目'无效。
它可能是一个红鲱鱼,但表本身已被删除并重新创建了很多次(在开发中,软件有一点"如果它不存在则创建&#34 ;逻辑);它似乎有时创造并且快乐;有时候时间会让事情变得更好。
它确实在大多数情况下工作,但是当它失败时,它会在一段时间内一直失败(通常导致删除表并重新尝试)
我已经按照https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-how-to-use-dotnet中的基本示例进行了操作,因此我认为只有一些我不知道的微妙内容,或者我需要澄清以确保不会这样做#&# 39; t发生。
我使用的代码是
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureConnectionString);
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference(myTableName);
table.CreateIfNotExists();
TableOperation retrieveOperation = TableOperation.Retrieve<MyDataEntity>(itemPartitionKey, itemRowKey)
TableResult retrievedResult = table.Execute(retrieveOperation);
if (retrievedResult.Result != null)
{
TableOperation inserOperation = TableOperation.Insert(loadMyDataItem);
table.Execute(insertOperation);
}
再次它可能是一个红鲱鱼,但似乎表格不存在然后它通过查找并添加该数据;但在第二次传递(即重新启动程序),它在桌面上失败。执行&#34;元数据URI&#34;错误信息。
我也尝试将创建分离出来并将其作为流程的不同部分(因此我只检查现有数据然后插入操作),但这并不是似乎有很大的不同。
更新:这是通过MonoDevelop
运行的更新:如果它是第一次通过和/或表存储中没有数据(即结果为空),它看起来像是有效的;如果有数据,它看起来最初失败,然后经过一段时间后#34;来得好&#34 ;;如果有数据,我使用ExecuteQuery方法而不是Execute方法,它看起来更一致地工作。我可能会转向ExecuteQuery(可能只是在MonoDevelop中更好地实现了?),但它仍然感觉我做错了什么并且可以用更好的代码来解决。
答案 0 :(得分:0)
我不确定为什么会这样,而且上述方法并不适用;但如果其他人遇到这个问题,这似乎是一个可行的解决方法。
var tableQuery = new TableQuery<MyDataEntity>().Where(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, itemPartitionKey),
TableOperators.And,
TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, itemRowKey)));
var myDataEntities = table.ExecuteQuery(tableQuery).ToList();
if (myDataEntities.Count == 0)
{
TableOperation inserOperation = TableOperation.Insert(loadMyDataItem);
table.Execute(insertOperation);
}
当数据库中没有数据时,它似乎没有失败,但是当它存在时(至少在最近添加它时)似乎失败了。我不确定这是Mono还是Azure或某种组合造成的。
向TableQuery和ExecuteQuery的过渡,而更多的代码似乎有用。