更新到 dotnet 5 后出现 Cosmos DB TransactionalBatch 错误
Cosmos DB TransactionalBatch error after update to dotnet 5
我的基础存储库中有一些方法可以在 Cosmos DB 上执行一些批处理操作,它们是这样的:
public async Task AddRangeAsync(List<T> entities)
{
var container = _cosmosDbClientFactory.GetContainer(CollectionName);
var entitiesList = entities.Split(_maxItemsPerBatch).ToList();
foreach (var items in entitiesList)
{
var partitionKey = ResolvePartitionKey(items.FirstOrDefault());
var transactionalBatch = container.CreateTransactionalBatch(partitionKey);
items.ToList().ForEach(item => transactionalBatch.CreateItem(item));
var result = await transactionalBatch.ExecuteAsync();
if (!result.IsSuccessStatusCode)
{
throw new CosmosDbBatchOperationException(result.ErrorMessage);
}
}
}
今天我将项目的 dotnet 版本从 dotnet 3.1 迁移到 dotnet 5,之后出现此错误:
System.MissingMethodException : Method not found: 'System.Threading.Tasks.Task1<Microsoft.Azure.Cosmos.Serialization.HybridRow.Result> Microsoft.Azure.Cosmos.Serialization.HybridRow.RecordIO.RecordIOStream.ReadRecordIOAsync(System.IO.Stream, System.Func
2<System.ReadOnlyMemory1<Byte>,Microsoft.Azure.Cosmos.Serialization.HybridRow.Result>, System.Func
2<System.ReadOnlyMemory1<Byte>,Microsoft.Azure.Cosmos.Serialization.HybridRow.Result>, Microsoft.Azure.Cosmos.Serialization.HybridRow.MemorySpanResizer
1)'.
这发生在这一行:
var result = await transactionalBatch.ExecuteAsync();
版本信息:
- Microsoft.Azure.Cosmos v3.17.0
- 网络 5.0.201
有人知道怎么解决吗?
看来您遇到的问题可能与 SDK issue 中讨论的问题相同。
完整的二进制清理和重建值得尝试清除 Microsoft.Azure.Cosmos.Serialization.HybridRow.dll
的依赖冲突。如果这不起作用,您可以尝试将您的详细信息添加到该问题线程。
我检查了我所有的项目,它们引用了相同的 sdk 版本,所以我清理了我的解决方案并删除了所有 obj 和 bin 文件夹并再次尝试,但没有成功。
然后我尝试了这个 solution 因为我正在使用 Microsoft.Azure.Cosmos 3.17.0 和 AspNetCore.HealthChecks.CosmosDb 5.0.3 ,所以我将 AspNetCore.HealthChecks.CosmosDb 降级到版本 3.1.2 并且它有效。
我的基础存储库中有一些方法可以在 Cosmos DB 上执行一些批处理操作,它们是这样的:
public async Task AddRangeAsync(List<T> entities)
{
var container = _cosmosDbClientFactory.GetContainer(CollectionName);
var entitiesList = entities.Split(_maxItemsPerBatch).ToList();
foreach (var items in entitiesList)
{
var partitionKey = ResolvePartitionKey(items.FirstOrDefault());
var transactionalBatch = container.CreateTransactionalBatch(partitionKey);
items.ToList().ForEach(item => transactionalBatch.CreateItem(item));
var result = await transactionalBatch.ExecuteAsync();
if (!result.IsSuccessStatusCode)
{
throw new CosmosDbBatchOperationException(result.ErrorMessage);
}
}
}
今天我将项目的 dotnet 版本从 dotnet 3.1 迁移到 dotnet 5,之后出现此错误:
System.MissingMethodException : Method not found: 'System.Threading.Tasks.Task
1<Microsoft.Azure.Cosmos.Serialization.HybridRow.Result> Microsoft.Azure.Cosmos.Serialization.HybridRow.RecordIO.RecordIOStream.ReadRecordIOAsync(System.IO.Stream, System.Func
2<System.ReadOnlyMemory1<Byte>,Microsoft.Azure.Cosmos.Serialization.HybridRow.Result>, System.Func
2<System.ReadOnlyMemory1<Byte>,Microsoft.Azure.Cosmos.Serialization.HybridRow.Result>, Microsoft.Azure.Cosmos.Serialization.HybridRow.MemorySpanResizer
1)'.
这发生在这一行:
var result = await transactionalBatch.ExecuteAsync();
版本信息:
- Microsoft.Azure.Cosmos v3.17.0
- 网络 5.0.201
有人知道怎么解决吗?
看来您遇到的问题可能与 SDK issue 中讨论的问题相同。
完整的二进制清理和重建值得尝试清除 Microsoft.Azure.Cosmos.Serialization.HybridRow.dll
的依赖冲突。如果这不起作用,您可以尝试将您的详细信息添加到该问题线程。
我检查了我所有的项目,它们引用了相同的 sdk 版本,所以我清理了我的解决方案并删除了所有 obj 和 bin 文件夹并再次尝试,但没有成功。 然后我尝试了这个 solution 因为我正在使用 Microsoft.Azure.Cosmos 3.17.0 和 AspNetCore.HealthChecks.CosmosDb 5.0.3 ,所以我将 AspNetCore.HealthChecks.CosmosDb 降级到版本 3.1.2 并且它有效。