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

Cosmos DB provider in Entity Framework Core throwing 400 BadRequest

我已将 Cosmos DB 集成到我的 ASP.NET Core API 项目中,使用 Cosmos DB 提供程序附带的最新 EF Core 包。

当 运行在本地 ASF 集群中本地连接到本地 Cosmos DB 模拟器实例时,我能够成功使用此提供程序。但是,在本地 ASF 或 Azure 托管的 ASF 中尝试 运行 时,我无法连接到 Azure Cosmos DB 实例。出于某种原因,我在为 database/collection.

初始化种子时不断收到 400 BadRequest

产生错误的是以下行:

var created = await context.Database.EnsureCreatedAsync();

异常:

BadRequest at Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosClient.CreateDocumentCollectionIfNotExistsOnceAsync(DbContext _, String collectionId, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState,TResult](Func4 operation, Func4 verifySucceeded, TState state, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState,TResult](Func4 operation, Func4 verifySucceeded, TState state, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosDatabaseCreator.EnsureCreatedAsync(CancellationToken cancellationToken) at Infrastructure.SystemDataContextSeed.SeedAsync(SystemDataContext context) in Infrastructure\SystemDataContextSeed.cs:line 21 at xtensions.IWebHostExtensions.Seed(IWebHost webhost) in Extensions\IWebHostExtensions.cs:line 23 at Api.<>c__DisplayClass1_0.b__1(String url, AspNetCoreCommunicationListener listener) in AccountApi.cs:line 47 at Microsoft.ServiceFabric.Services.Communication.AspNetCore.AspNetCoreCommunicationListener.OpenAsync(CancellationToken cancellationToken) at Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.OpenCommunicationListenersAsync(CancellationToken cancellationToken)

我尝试过的:

使用的端点详细信息采用以下形式:

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

非常感谢任何想法!

作为参考,EF Core 2.2 中的 Cosmos DB 提供程序是预览版,不适合用于 Azure-hosted Cosmos DB。 这是因为在某些地方,缺少 headers 这显然不是模拟器的问题,但在针对 Azure 执行时会导致 400。

我关注时间最长的问题是当它试图创建文档时我得到了 400 collection。深入研究 EF Core 源代码后,我发现它没有发送任何分区键。在当前的 Cosmos DB 实现中实际上根本没有分区键的实现。因为我在 Azure 中创建了一个跨 collection 共享吞吐量的数据库,显然你需要在 collection 级别提供分区键。

我在使用新创建的 CosmosDB 帐户时遇到此错误。有些事情奏效了,但我也遇到了这样的错误,例如 400 一个用于 EF Core EnsureCreated() 调用的错误,以及 404 试图跳过那个错误而只是 .SaveChanges().

我最终删除了那个 CosmosDB 帐户并创建了一个新帐户,这次一切正常。

我用了Microsoft.EntityFrameworkCore.Cosmos (6.0.0).

哦,我在“Default-Web-EastUS”资源组中创建了新的 CosmosDB 帐户,而之前的尝试使用了“Default-Storage-EastUS”资源组。我怀疑这很重要,但想记下所有内容,以防将来我必须 google 我自己的答案 ;-)