Entity Framework Core中的Cosmos DB提供程序抛出400 BadRequest

时间:2018-12-08 13:17:44

标签: c# entity-framework-core azure-cosmosdb azure-cosmosdb-sqlapi

我已使用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](Func 4 operation, Func 4验证成功,TState状态,CancellationToken cancelleToken)
  在Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync [TState,TResult](Func 4 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)

我尝试过的事情:

  • 分析日志分析,不显示这些请求的日志记录
  • 删除确保创建并直接插入数据
  • 手动创建集合(SystemDataContext)
  • 手动创建数据库(AccountService)
  • 天蓝色删除网络防火墙(允许所有网络)

使用的端点详细信息的形式为:

"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;
        }

任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:1)

作为参考,EF Core 2.2中的Cosmos DB提供程序是预览版,不适合与Azure托管的Cosmos DB一起使用。 这是因为在某些地方,缺少标头显然不是模拟器所要解决的问题,但是在针对Azure执行时会导致400。

我一直在考虑的问题是,当我试图创建文档集合时得到了400。深入研究EF Core源代码后,我发现它没有发送任何分区键。在当前的Cosmos DB实现中,实际上根本没有实现分区键。并且由于我在Azure中创建了一个数据库,并且具有跨集合的共享吞吐量,因此您显然需要在集合级别提供分区键。