Search code examples
c#asp.net-coreservicestackormlite-servicestack

Seeding ServiceStack database


In .net core projects I do my seeding inside the Program.cs file like this:

var host = BuildWebHost(args);

using (var scope = host.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    try
    {
        var context = services.GetRequiredService<ApplicationDbContext>();

        //.. do seeding
    }
    catch
    {

    }
}

host.Run();

In service stack are the services registered in same place? I tried the code below but var db = context.OpenDbConnection() throws exception that service is not registered:

No service for type 'ServiceStack.Data.IDbConnectionFactory' has been registered.

This is how I call it:

var host = BuildWebHost(args);

using (var scope = host.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    try
    {
        var context = services.GetRequiredService<IDbConnectionFactory>();


        using (var db = context.OpenDbConnection())
        {
            if(!db.Select<Register>(x => x.Email == "test@example").Any())
            {
                db.Insert(new Register
                {
                    Email = "[email protected]",
                    Password = "1234"
                });
            }

        }

        //.. do seeding
    }
    catch
    {

    }

 }

host.Run();

This is how I register it in Startup.cs Configure()

container.Register<IDbConnectionFactory>(c =>
    new OrmLiteConnectionFactory(_sqliteFileDb, SqliteDialect.Provider));

container.Register<IAuthRepository>(c =>
    new OrmLiteAuthRepository(c.Resolve<IDbConnectionFactory>()));

container.Resolve<IAuthRepository>().InitSchema();

What is right way for me to register and retrieve the database context?


Solution

  • You're looking for dependencies in .NET Core's IOC but dependencies registered in ServiceStack's IOC is only visible to ServiceStack.

    Normally you would just seed the data after registering the dependency since they're both only registered and configured once on Startup, e.g:

    container.Register<IDbConnectionFactory>(c =>
        new OrmLiteConnectionFactory(_sqliteFileDb, SqliteDialect.Provider));
    
    using (var db = container.Resolve<IDbConnectionFactory>().Open())
    {
        SeedData(db);
    }
    

    Otherwise you can access dependencies in ServiceStack's IOC with:

    var dbFactory = HostContext.TryResolve<IDbConnectionFactory>();
    
    using (var db = dbFactory.Open())
    {
    }