Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing dbContext in a C# console application

I have tried to figure this out, but I am stuck.

I have a Net Core 2 application with Service/Repo/Api/Angular layers - but now I want to 'bolt on' a console application and access all the goodies I have already built up. I seem to be in a mess of static objects and DI and null parameters. Anyway, here is a simplified version of my code.

namespace SimpleExample
{

    class Program
    {

        private static ApplicationDbContext _appDbContext;

        public Program(ApplicationDbContext appDbContext)
        {
            _appDbContext = appDbContext;
        }

        static void Main(string[] args)
        {
            var instance = new Program();  // this doesn't work!
            var instance = new Program(_appDbContext);  // neither does this!
            instance.GetData();
        }


        private void GetData()
        {
            Console.WriteLine("Let's read some data! Press a key to continue.");
            Console.ReadLine();

            var data = "my data";
            var result = GetId(data);
        }


        private string GetId(string original)
        {
            var data = _appDbContext.Data
                .Where(x => x.Name == original.Trim)
                .FirstOrDefault();

            return data;

        }
    }

}

I am getting the classic

'An object reference is required for the non-static field'

error. Then from investigating on here I changed things to static and then everything becomes null.

It's not just the DbContext I am trying to inject. I'm also trying to inject

private ManagerService _managerService;

but getting same errors.

Update

If I try

private static ApplicationDbContext _appDbContext = new ApplicationDbContext();

as suggested a few times below, then I get the error

There is no argument given that corresponds to the required formal parameter 'options' of 'ApplicationDbContext.ApplicationDbContext(DbContextOptions)'

like image 270
spankymac Avatar asked Apr 23 '18 02:04

spankymac


People also ask

What is DbContext C?

A DbContext instance represents a combination of the Unit Of Work and Repository patterns such that it can be used to query from a database and group together changes that will then be written back to the store as a unit. DbContext is conceptually similar to ObjectContext.

How is DbContext implemented?

Defining a DbContext derived classOnce you have a context, you would query for, add (using Add or Attach methods ) or remove (using Remove ) entities in the context through these properties. Accessing a DbSet property on a context object represent a starting query that returns all entities of the specified type.

Should you use using with DbContext?

EF and EF Core DbContext types implement IDisposable . As such, best practice programming suggests that you should wrap them in a using() block (or new C# 8 using statement). Unfortunately, doing this, at least in web apps, is generally a bad idea.


1 Answers

OK, I have figured this out, and I'll post my answer for anyone else struggling in this situation.

When you launch the console app, your normal startup.cs doesn't execute, so you have to put a lot of that code in your console app.

    private static SiteService _siteService;
    private static ApplicationDbContext _appDbContext;

    public static void Main()
    {
        var services = new ServiceCollection();                      

        services.AddTransient<ISiteInterface, SiteRepo>();
        services.AddTransient<SiteService>();
        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer("blah-blah"));            

        var serviceProvider = services.BuildServiceProvider();                                             
        _siteService = serviceProvider.GetService<SiteService>();
        _appDbContext = serviceProvider.GetService<ApplicationDbContext>();    
        GetData();
    }

and now your _appDbContext will be available throughout the rest of your console app.

Hope that helps!

like image 84
spankymac Avatar answered Oct 24 '22 08:10

spankymac