B. Jones
B. Jones

Reputation: 25

Access DBContext in ASP.NET Core 6 from data access layer class

I have an ASP.NET Core 6 MVC app that I created from a VS 2022 template. I'm writing a custom data access layer and business logic layer.

I know I can pass the _context from the controllers down through the BLL in the DAL, however I would prefer to have direct access from the DAL. I don't see any reason the BLL or the web code need to have anything to do with data access.

I've tried several examples of injection, but I can't seem to get any of them to work. Does anyone have a good solution?

Edit:

In Project.cs I have added DbContext:

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));

I would like to get access to DbContext in my custom data access layer without having to pass DbContext all the way down from a Controller into my DAL contructor like so:

namespace MyProject.Code
  public class CustomDataAccessLayer
  {
    public string[] GetCustomers()
    {
      DbConnection conn = DbContext.GetConnection();
      //Whatever query logic I want to do here

Is there any way to access DbConext directly without having to pass it in from within a controller action?

Upvotes: 1

Views: 3342

Answers (3)

Nasibli İlkin
Nasibli İlkin

Reputation: 1

with json :

var constr = builder.Configuration["ConnectionStrings:Default"];
builder.Services.AddDbContext<AppDbContext>(opt => {
    opt.UseSqlServer(constr);
});

Json :

"ConnectionStrings": {
    "Default": "Server=Victus;Database=TeamDb;Trusted_Connection=true;"
}

AppDbContext.cs :

public class AppDbContext:DbContext {
    public AppDbContext(DbContextOptions <AppDbContext> options) : base(options) { }
    public DbSet<team> teams { get; set; }
}

Home Controller :

private AppDbContext _appDbContext;
    public HomeController(AppDbContext appDbContext) {
        _appDbContext = appDbContext;
    }
    public IActionResult Index() {
        return View(_appDbContext.teams);
    }

Upvotes: 0

Serge
Serge

Reputation: 43959

you don't need to add dbcontext to a controller, nobody does it if there is a data access layer, DI will automatically inject the context

 public class CustomDataAccessLayer
 {
    private readonly ApplicationDbContext _context;
   
        public CustomDataAccessLayer(ApplicationDbContext context)
        {
            _context = context;
        }

         public string[] GetCustomers()
        {
           //your code
        }
    
 }

Upvotes: 0

odaiwa
odaiwa

Reputation: 335

Here you can read about how DI works exactly.

I'll provide some example of how you're supposed to do that.

first you need to have DataContext Class that extends DbContext Class that will be like this

using Microsoft.EntityFrameworkCore;

namespace MyProject.Context
{
    public class DataContext : DbContext
    {
        public DataContext(DbContextOptions options) : base(options)
        {
        }

        public DbSet<MyEntity> Entities { get; set; }
    }
}

In the Program.cs you need to add theDataContextlike this

builder.Services.AddDbContext<DataContext>(options =>
{
    options.UseSqlServer(builder.Configuration
        .GetConnectionString("DefaultConnection")); // for example if you're holding the connection string in the appsettings.json
});

and then in the Logic class that you want to use it in make a data member in the class of type DataContext

private readonly DataContext _dataContext;

and your constructor must take DataContext as parameter and Initialize your constructor will look like this

public ClassName(DataContext dataContext)
{
    _dataContext = dataContext;
}

Upvotes: 3

Related Questions