Introduction
With EF Code First, the built in DB Initializers, DropCreateDatabaseAlways
, CreateDatabaseIfNotExists
, and DropCreateDatabaseIfModelChanges
, and any classes you derive straight from these, only invoke their Seed
method when your DbContext
based class needs to access the database. This can be frustrating, especially when you are debugging Seed
methods and start an application merely to check DB initialization. This tip describes a very simple way to ensure your DB is always initialized before your client app even starts up, without having to write unwanted code in the client app.
How Do I Do This?
Simply invoke a data access method inside a static
constructor for your DbContext
derivative:
public class TheContext: DbContext
{
static TheContext()
{
Database.SetInitializer(new DbInitAlways());
var ctx = new TheContext();
var r = ctx.Roles.First();
}
public DbSet<Role> Roles { get; set; }
}
Points of Interest
- The first line above, setting the initializer, should always be changed to set a suitable initializer. Using a
DropCreateDatabaseAlways
or derivative, like I have, will always drop the database. IT WILL ALWAYS DESTROY ANY TEST DATA YOU HAVE CAPTURED. - I just used
Roles
because it was a convenient and common DbSet
on my DbContext
. Use any available to you. - It is necessary to call
First
on Roles
, and not just Roles
, as the latter returns an IQueryable
, which only accesses the DB when needed, that is, when iterated, or queried for a specific object.