AG70
AG70

Reputation: 996

How to pass options from Startup.cs to DbContextOptions constructor function at ASP.NET Core 2.0

I am using ASP.NET Core 2.0

At Startup.cs I have

services.AddDbContext<MailDBServicesContext>(optionsSqLite =>
        {
            optionsSqLite.UseSqlite("Data Source=Mail.db");
        });

I have created a model and a DbContext where DbContext is:

public class MailDBServicesContext : DbContext
{
    public MailDBServicesContext(DbContextOptions<MailDBServicesContext> options)
        : base(options)
    {

    }

    public DbSet<MailCountSentErrorMails> DbSetMailCountSentErrorMails { get; set; }
}

from a Class helper I need to pass DbContextOptions and my question is how can I tell to use the options from the Startup.cs ConfigureServices method

using (var db = new MailDBServicesContext())
                        {
                        }

Upvotes: 4

Views: 2139

Answers (1)

Ignas
Ignas

Reputation: 4338

It should be enough to simply inject MailDBServicesContext into your controller or a service class, for example.

public class SomeDataService
{
    private readonly MailDBServicesContext _dbContext;

    public SomeDataService(MailDBServicesContext dbContext)
    {
        _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
    }

    public async Task AddMailCounts()
    {
        _dbContext.DbSetMailCountSentErrorMails
            .Add(new MailCountSentErrorMails { CountSentMails = 55 });
        await _dbContext.SaveChangesAsync();
    }
}

Other DB context configuration options are defined in Configuring a DbContext on MSDN.

Update

Make sure to register your service in DI, i.e. ConfigureServices method.

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ISomeDataService, SomeDataService>();
    services.AddDbContext<MailDBServicesContext>(optionsSqLite =>
    {
        optionsSqLite.UseSqlite("Data Source=Mail.db");
    });

    services.AddMvc();
}

Then make a call to AddMailCounts() in your controller.

public class HomeController : Controller
{
    private readonly ISomeDataService _dataService;

    public HomeController(ISomeDataService dataService)
    {
        _dataService = dataService ?? throw new ArgumentNullException(nameof(dataService));
    }

    public IActionResult Index()
    {
        _dataService.AddMailCounts();

        return View();
    }
}

Now every time you load homepage, a record is inserted into DbSetMailCountSentErrorMails table.

You can find working solution on my GitHub.

Upvotes: 4

Related Questions