簡體   English   中英

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

[英]Cosmos DB provider in Entity Framework Core throwing 400 BadRequest

我已使用 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 cancelationToken) 的 BadRequest
在 Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState,TResult](Func 4 operation, Func 4 verifySucceeded, TState state, CancellationToken cancelationToken)
在 Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState,TResult](Func 4 operation, Func 4 verifySucceeded,TState 狀態,CancellationToken 取消令牌)在 Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosDatabaseCreator.EnsureCreatedAsync(在CancellationTokenCancellationToken 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(NetCore url,CommunicationListener Asp ) 在 AccountApi.cs:line 47 at Microsoft.ServiceFabric.Services.Communication.AspNetCore.AspNetCoreCommunicationListener.OpenAsync(CancellationToken cancelingToken) at Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.OpenCommunicationListenersAsync(CancellationToken cancelationToken)

我試過的:

  • 分析日志分析,不顯示這些請求的日志記錄
  • 去掉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;
        }

任何想法都非常感謝!

作為參考,EF Core 2.2 中的 Cosmos DB 提供程序是一個預覽版,不適合用於 Azure 托管的 Cosmos DB。 這是因為在某些地方,缺少標頭顯然不是模擬器的問題,但在針對 Azure 執行時會導致 400。

我看的時間最長的問題是,當它嘗試創建文檔集合時,我得到了 400。 在挖掘 EF Core 源代碼后,我看到它沒有發送任何分區鍵。 在當前的 Cosmos DB 實現中實際上根本沒有分區鍵的實現。 並且因為我在 Azure 中創建了一個跨集合共享吞吐量的數據庫,所以您顯然需要在集合級別提供分區鍵。

我使用新創建的 CosmosDB 帳戶收到此錯誤。 有些事情奏效了,但我也遇到了這樣的錯誤,例如 400 個 EF Core 確保創建()調用,以及 404 在嘗試跳過該錯誤並僅使用 .SaveChanges() 時。

我最終刪除了那個 CosmosDB 帳戶並創建了一個新帳戶,這次一切正常。

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

哦,我在“Default-Web-EastUS”資源組中創建了新的 CosmosDB 帳戶,而之前的嘗試使用的是“Default-Storage-EastUS”。 我懷疑這很重要,但想記下所有內容,以防將來我必須用谷歌搜索自己的答案;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM