当前位置: 首页 > 知识库问答 >
问题:

实体框架核心中的Cosmos DB提供程序抛出400 BadRequest

司迪
2023-03-14

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

当在本地ASF集群中运行时,我能够成功地使用这个提供者,连接到本地Cosmos DB模拟器实例。然而,当试图在本地ASF或Azure托管的ASF中运行时,我无法连接到Azure Cosmos DB实例。由于某种原因,在初始化数据库/集合的种子时,我一直收到400 BadRequest。

以下行正在生成错误:

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

例外:

BadRequest atMicrosoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosClient.CreateDocumentCollectionIfNotExistsOnceAsync(DbContext_, String Coll的Id, CenseationToken取消代币)
atMicrosoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState, TResult](Func4操作, Func4验证成功,TState, CenseationToken取消代币)
atMicrosoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState, TResult](Func4操作, Func4验证成功,TState, CenseationToken取消代币)atMicrosoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosDatabaseCreator.EnsureCreatedAsync(CenseationToken取消代币)atInfrastructure.SystemDataContextSeed.SeedAsync(SystemDataContext上下文)in基础设施\SystemDataContextSeed.cs: line 21 atxtensions.IWebHostExtensions.Seed(IWebHost webhost)in Extis\IWebHostExtensions.cs: line 23 at Api.

我试过的:

  • 分析日志分析,显示这些请求没有日志记录
  • 删除确保创建,仅直接插入数据
  • 手动创建集合(系统html" target="_blank">数据上下文)
  • 手动创建数据库(帐户服务)
  • 在 Azure 中删除网络防火墙(允许所有网络)

使用的endpoint详细信息的形式如下:

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

任何想法都非常感谢!

共有2个答案

贾骏喆
2023-03-14

我在新创建的CosmosDB帐户中遇到了这个错误。有些事情是可行的,但我也遇到了类似这样的错误:EF Core.encurecreated()调用的400个错误,以及尝试跳过该调用时的404个错误,只是.SaveChanges()。

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

我使用了Microsoft.EntityFrameworkCore。宇宙(6.0.0)。

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

魏松
2023-03-14

作为参考,EF Core 2.2中的Cosmos DB provider是预览版,不适合用于Azure托管的Cosmos DB。这是因为在某些地方,头丢失了,这显然不是模拟器的问题,但在对Azure执行时会导致400。

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

 类似资料:
  • 我试图连接我的实体框架在MySQL数据库,但当我连接这个错误发生 找不到具有固定名称“mysql.data.mysqlclient”得ADO.NET提供程序得实体框架提供程序.确保在应用程序配置文件的“Entity Framework”部分中注册了提供程序。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882。 这是我的类库whit实体的a

  • 错误消息: System.InvalidOperationException:未找到具有固定名称“System.Data.SqlClient”得ADO.NET提供程序得实体框架提供程序.确保在应用程序配置文件的“Entity Framework”部分中注册了提供程序。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882。

  • 问题内容: 我正在尝试将Entity Framework与MySQL配合使用,但出现上述错误。我安装了最新的MySQL连接器。 完整错误为: 但是,我找不到任何建议说明您如何在“ entityFramework”部分中进行注册的内容。 其他一些帖子(例如)建议将提供程序添加到该 部分中,如下所示: 但这不起作用,因为它声称名称是重复的。而且,如果我实际上遍历了,我可以看到最后一个是MySQL提供程

  • 我有一个与问题“找不到具有固定名称”System.Data.SqlClient“的ADO.NET提供程序的实体框架提供程序”中提供的问题类似的问题,错误包含以下消息: “具有固定名称”System.Data.SqlClient“的ADO.NET提供程序未在计算机或应用程序配置文件中注册,或者无法加载。有关详细信息,请参阅内部异常。” 正如相关问题的答案所提示的,我已经通过包管理器控制台重新安装了实

  • 在nuget下载EF6并尝试运行我的项目后,它返回以下错误: 找不到具有固定名称“System.Data.SqlClient”得ADO.NET提供程序得实体框架提供程序.确保在应用程序配置文件的“Entity Framework”部分中注册了提供程序。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882。

  • 我有一个ASP MVC.NET核心(C#)项目,由于业务原因,SQL表不能有外键,因此,EF模型不映射关系(Entity.HasMany...)。 假设EF为实体生成一个模型,为生成一个模型。我想知道他们两个之间的关系。一个有多个并且一个属于一个。该任务在数据库中有项目Id(但请记住,它没有设置为FK)。 现在,我想通过to Entity获得一个项目列表,同时获得每个项目的任务列表。我通过创建一个