【问题标题】:Cosmos DB provider in Entity Framework Core throwing 400 BadRequestEntity Framework Core 中的 Cosmos DB 提供程序抛出 400 BadRequest
【发布时间】:2018-12-08 13:17:43
【问题描述】:

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

当我在本地 ASF 集群中本地运行时,我能够成功使用此提供程序,连接到本地 Cosmos DB 模拟器实例。但是,当尝试在本地 ASF 或 Azure 托管的 ASF 中运行时,我无法连接到 Azure Cosmos DB 实例。出于某种原因,在初始化数据库/集合的种子时,我不断收到 400 BadRequest。

产生错误的是以下行:

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

例外:

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

我尝试过的:

  • 分析日志分析,显示这些请求没有日志记录
  • 删除 EnsureCreated 并直接插入数据
  • 手动创建集合 (SystemDataContext)
  • 手动创建数据库 (AccountService)
  • 在 azure 中删除网络防火墙(允许所有网络)

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

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

非常感谢任何想法!

【问题讨论】:

  • 您只发布了异常的 stacktrace - 但没有发布实际异常及其异常消息和可能的内部异常。请也发布此重要信息!
  • 其实就是,消息只是'BadRequest',仅此而已……而且没有内部异常,如果不清楚,请见谅!
  • 您必须缺少一些额外的错误数据。 BadRequest 非常笼统,通常带有解释。
  • 我希望...我已经研究了一段时间,但是这里的 Stacktrace 就是全部...我想知道它是否与集合名称有关,在挖掘之后在存储库中。我根本没有指定它,但它适用于 localhost...
  • 作为参考,我在github.com/aspnet/EntityFrameworkCore/issues/14123 创建了一个问题,显然对 Azure 托管的 cosmos db 实例没有任何请求。缺少标题会阻止它成功创建集合、文档、...

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


【解决方案1】:

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

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

【讨论】:

  • 这基本上是说,这个问题没有办法解决吗?有什么选择?
  • 不适用于预览版 AFAIK。我从我们的解决方案中去掉了 EF 并使用了 Cosmonaut。至少现在我知道发生了什么……
  • 您始终可以使用 CosmosClient 创建自己的 DB Initiator,并将您的分区键放入每个集合中。
【解决方案2】:

我在新创建的 CosmosDB 帐户中遇到此错误。有些事情奏效了,但我也遇到了类似 EF Core EnsureCreated() 调用的 400 错误,以及尝试跳过该错误并仅 .SaveChanges() 时的 404。

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

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

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

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2020-02-25
    相关资源
    最近更新 更多