36

For EF6, I can check whether a database exists in the following way:

context.Database.Exists()

How can I do this in EF Core?

Don Tomato
  • 3,311
  • 3
  • 30
  • 48

4 Answers4

55

I have found the solution on my own:

(context.GetService<IDatabaseCreator>() as RelationalDatabaseCreator).Exists()

It works for EF 7.0.0-rc1-final version for SqlServer

UPDATE:

Entity Framework Core 2.0:

(context.Database.GetService<IDatabaseCreator>() as RelationalDatabaseCreator).Exists()
Don Tomato
  • 3,311
  • 3
  • 30
  • 48
  • 10
    Entity Framework Core 2.0: `(context.Database.GetService() as RelationalDatabaseCreator).Exists()` – Marcel Sep 13 '17 at 16:51
  • 7
    For EF Core 2.0: There is no need for casting, just use context.Database.GetService() instead – Jeroen Apr 08 '19 at 08:28
  • 4
    I had wierd problem with EF Core 3.1. I needed to add manually `using Microsoft.EntityFrameworkCore.Infrastructure;` in my code. Intellisense didnt tells me what i need to do to get `GetService()` method. – michasaucer Jan 09 '20 at 07:10
  • It don't correct working in EF 3.1 for me. For example database exists but Exists() method return false – Ramil Aliyev 007 Mar 07 '20 at 08:01
  • @Don Tomatto Not working for us. We're using 3.1.8. – Venkatesh Oct 29 '20 at 13:13
  • 1
    Note that this will also report false if the database is simply offline or inaccessible to the user due to permissions. In other words, this is really not "exists", but instead more like "can I connect to it right now". – DonBoitnott Apr 28 '21 at 19:42
43

UPDATE .Net Core 3.1

To check if a database exists and can be contacted:

dbContext.Database.CanConnect()
flip
  • 1,271
  • 14
  • 28
3

The other solutions tell you whether the database is connectable:

context.Database.GetService<IRelationalDatabaseCreator>().Exists();  //true
context.Database.EnsureDeleted();
context.Database.GetService<IRelationalDatabaseCreator>().Exists();  //true

I want to know whether the database exists:

context.Database.GetService<IRelationalDatabaseCreator>().HasTables();  //true
context.Database.EnsureDeleted();
context.Database.GetService<IRelationalDatabaseCreator>().HasTables();  //false

Note this weird behavior:

context.Database.EnsureDeleted();
context.Database.GetService<IRelationalDatabaseCreator>().HasTables();  //false
context.Database.EnsureCreated();
context.Database.GetService<IRelationalDatabaseCreator>().HasTables();  //true
context.Database.EnsureDeleted();
context.Database.GetService<IRelationalDatabaseCreator>().HasTables();  //true !!

So it's not perfect, but depending on your use case it could be useful.

lonix
  • 14,255
  • 23
  • 85
  • 176
0

Entity Framework Core 6.0.7:

dbContext.GetService<IDatabaseCreator>().CanConnect();

works for NpgsqlDatabaseConnector - the Npgsql.EntityFrameworkCore.PostgreSQL 6.0.5 provider and probably for all RelationalDatabaseCreator descendants since it tests if database really exists as the default/base implmentation.

Motlicek Petr
  • 767
  • 9
  • 10