Ho integrato Cosmos DB nel mio progetto API ASP.NET Core, utilizzando l'ultimo pacchetto EF Core fornito con un provider Cosmos DB.
Sono in grado di utilizzare correttamente questo provider quando viene eseguito localmente nel mio cluster ASF locale, collegandomi a un'istanza dell'emulatore Cosmos DB locale. Tuttavia, quando si cerca di eseguire ASF locale o ASF ospitato da Azure, non riesco a connettermi all'istanza di Azure Cosmos DB. Per qualche ragione continuo a ricevere 400 BadRequest durante l'inizializzazione del seed per il database / collezione.
È la seguente riga che genera un errore:
var created = await context.Database.EnsureCreatedAsync();
Eccezione:
BadRequest su Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosClient.CreateDocumentCollectionIfNotExistsOnceAsync (DbContext _, String collectionId, CancellationToken cancellationToken)
a Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync [TState, TResult] (4 operation, Func
44 operation, Func
4 verifySucceeded, TState state, CancellationToken cancellationToken)
su Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync [TState, TResult] (4 operation, Func
Func4 operation, Func
4 verifySucceeded, TState state, CancellationToken cancellationToken) su Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal.CosmosDatabaseCreator.EnsureCreatedAsync (CancellationToken cancellationToken) su Infrastructure .SystemDataContextSeed.SeedAsync (contesto SystemDataContext) in Infrastructure \ SystemDataContextSeed.cs: riga 21 in xtensions.IWebHostExtensions.Seed (IWebHost webhost) in Estensioni \ IWebHostExtensions.cs: riga 23 in Api. <> C__DisplayClass1_0.b__1 (String URL, listener AspNetCoreCommunicationListener ) in AccountApi.cs: riga 47 in Microsoft.ServiceFabric.Services.Communication.AspNetCore.AspNetCoreCommunicationListener.OpenAsync (CancellationToken cancellationToken) in Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.OpenCommunicationListenersAsync (CancellationToken cancellationToken)
Quello che ho provato:
I dettagli dell'endpoint utilizzati sono sotto forma di:
"Cosmos": {
"EndPoint": "https://xxxx-sqlapi.documents.azure.com:443",
"AuthKey": "xxx==",
"DatabaseName": "AccountService"
},
Metodo di estensione per collegare il provider 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;
}
Qualsiasi idea è molto apprezzata!
Per riferimento, il provider Cosmos DB in EF Core 2.2 è un'anteprima e non è adatto per l'uso nei confronti di un DB Cosmos ospitato da Azure. Questo perché in alcuni punti mancano le intestazioni che apparentemente non sono un problema per l'emulatore, ma causano un 400 quando si esegue l'esportazione contro Azure.
Il problema che stavo osservando più a lungo era il fatto che avevo un 400 quando cercavo di creare la raccolta di documenti. Dopo aver scavato nel codice sorgente EF Core, ho visto che non ha inviato alcuna chiave di partizione. In realtà non esiste alcuna implementazione delle chiavi di partizione nell'attuale implementazione del Cosmos DB. E poiché ho creato un database in Azure con throughput condiviso tra le raccolte, è necessario fornire una chiave di partizione a livello di raccolta apparentemente.