dotnet / efcore

EF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations.
https://docs.microsoft.com/ef/
MIT License
13.68k stars 3.17k forks source link

No longer possible to initialize CosmosDB client #28018

Open maximecaron opened 2 years ago

maximecaron commented 2 years ago

File a bug

In Microsoft.Azure.Cosmos v3.27.0 to initialize cosmosdb the only way is now to call CosmosClient.CreateAndInitializeAsync(); With CosmosSDK 2.0 it was possible to call OpenAsync to avoid startup latency on first request Ex:

await context.DataBase.GetCosmosclient().OpenAsync();

But this method have been removed and it's no possible anymore to Initialize CosmosDB client after it have been created. The problem we are having with Entity Framework Core is that Entity Framework is creating the CosmosClient instance at

https://github.com/dotnet/efcore/blob/70cd92974e09e938a92384e91b5c3179f4773725/src/EFCore.Cosmos/Storage/Internal/SingletonCosmosClientWrapper.cs#L103

And is not calling CreateAndInitializeAsync()

This is causing first request to take 2 seconds instead of 20 ms

AndriySvyryd commented 2 years ago

Since it's an async method adding new API would be non-trivial and therefore we first need to see whether there is more interest in this.

As a workaround you can run a small query instead of context.DataBase.GetCosmosclient().OpenAsync();

maximecaron commented 10 months ago

@AndriySvyryd One suggestion would be to change SingletonCosmosClientWrapper.cs to

    public virtual Task<CosmosClient> Client
        => _client ??= string.IsNullOrEmpty(_connectionString)
            ? CosmosClient.CreateAndInitializeAsync(_endpoint, _key, _options)
            : CosmosClient.CreateAndInitializeAsync(_connectionString, _options);