我已使用Cosmos DB提供程序附带的最新EF Core软件包将Cosmos DB集成到我的ASP.NET Core API项目中。
在本地ASF集群中本地运行并连接到本地Cosmos DB仿真器实例时,我能够成功使用此提供程序。但是,当尝试在本地ASF或Azure托管的ASF中运行时,我无法连接到Azure Cosmos数据库实例。由于某种原因,在初始化数据库/集合的种子时,我总是收到400 BadRequest。
以下行产生了错误:
var created = await context.Database.EnsureCreatedAsync();
例外:
BadRequest 在Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosClient.CreateDocumentCollectionIfNotExistsOnceAsync(DbContext _,String collectionId,CancellationToken cancelledToken)
在Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync [TState,TResult](Func4 operation, Func
4验证成功,TState状态,CancellationToken cancelleToken)
在Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync [TState,TResult](Func4 operation, Func
4验证成功,TState状态,CancellationToken cancelledToken)处 在Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosDatabaseCreator.EnsureCreatedAsync(CancellationToken cancellingToken) 在Infrastructure \ SystemDataContextSeed.cs:line 21中的Infrastructure.SystemDataContextSeed.SeedAsync(SystemDataContext上下文)处 在Extensions \ IWebHostExtensions.cs中的xtensions.IWebHostExtensions.Seed(IWebHost webhost)处:第23行 在AccountApi.cs:第47行中的Api。<> c__DisplayClass1_0.b__1(字符串url,AspNetCoreCommunicationListener侦听器) 在Microsoft.ServiceFabric.Services.Communication.AspNetCore.AspNetCoreCommunicationListener.OpenAsync(CancellationToken cancellingToken) 在Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.OpenCommunicationListenersAsync(CancellationToken cancelleToken)
我尝试过的事情:
使用的端点详细信息的形式为:
"Cosmos": {
"EndPoint": "https://xxxx-sqlapi.documents.azure.com:443",
"AuthKey": "xxx==",
"DatabaseName": "AccountService"
},
扩展方法来连接Cosmos DB提供程序:
public static IServiceCollection AddCosmosSettings(this IServiceCollection services, IConfiguration configuration)
{
services.AddEntityFrameworkCosmos()
.AddDbContext<SystemDataContext>(options =>
{
options.UseCosmos(configuration["Cosmos:EndPoint"], configuration["Cosmos:AuthKey"], configuration["Cosmos:DatabaseName"]); ;
},
ServiceLifetime.Scoped //Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request)
);
return services;
}
任何想法都将不胜感激!
答案 0 :(得分:1)
作为参考,EF Core 2.2中的Cosmos DB提供程序是预览版,不适合与Azure托管的Cosmos DB一起使用。 这是因为在某些地方,缺少标头显然不是模拟器所要解决的问题,但是在针对Azure执行时会导致400。
我一直在考虑的问题是,当我试图创建文档集合时得到了400。深入研究EF Core源代码后,我发现它没有发送任何分区键。在当前的Cosmos DB实现中,实际上根本没有实现分区键。并且由于我在Azure中创建了一个数据库,并且具有跨集合的共享吞吐量,因此您显然需要在集合级别提供分区键。