Entity Framework Core Using multiple DbContexts

asp.net-core-1.1, c#, dbcontext, entity-framework-core

Solution

I figured it out. This mostly came about because I accidentally deleted the database that Identity was using and I needed to figure out how to get it back.

Apparently there's nothing wrong with my connection string the way it is. I just needed to go into the package manager and type these commands in this order:

- `Add-Migration init -Context PartsDbContext`

- `Update-Database -Context PartsDbContext`

I found this out because that is what I had to do to get my ApplicationDbContext working again and it turns out that this step is done for you when you create a new MVC Core Web Application in Visual Studio using Individual User Authentication.

So basically the steps for adding more DbContexts is to:

- Create a DbContext Class

- Create a Connection string for that DbContext in appsettings.json

- Add the DbContext to your configured services in Startup.cs

- Setup the DbContext in the controllers that will use it.

- Open the package manager and run the 2 lines above. (if "-Context" doesn't work try "--context"

- Run your program and let EntityFrameworkCore take care of the rest.

Problem

I'm having a problem that when I try to access a field in my PartsDbContext I get the following error: System.Data.SqlClient.SqlException: 'Invalid object name 'fieldName'' It seems that this is because I'm trying to make my PartsDbContext use the same database as my ApplicationDbContext which is used with Identity. I need to know how to setup a 2nd dbcontext to work with EF core that uses/creates a different database. I've tried creating a 2nd connection string but that gets me this error: System.Data.SqlClient.SqlException: 'Cannot open database "PartsDb" requested by the login. The login failed. Login failed for user 'DESKTOP-4VPU567\higle'.' Here's my code: appsettings.json ``` "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-PrecisionCustomPC-b14db89e-86ad-4855-a17f-ac64a04339aa;Trusted_Connection=True;MultipleActiveResultSets=true", "PartsConnection": "Server=(localdb)\\mssqllocaldb;Database=PartsDb" }, "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Warning" } } ``` PartsDbContext.cs ``` public class PartsDbContext : DbContext { public DbSet<PartsViewModels.Tower> Towers { get; set; } public DbSet<PartsViewModels.Motherboard> Motherboards { get; set; } public PartsDbContext(DbContextOptions<PartsDbContext> options) : base(options) { } } ``` Startup.cs ``` public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); services.AddEntityFramework() .AddDbContext<PartsDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("PartsConnection"))); services.AddMvc(); services.AddAuthorization(options => { options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin")); }); // Add application services. services.AddTransient<IEmailSender, AuthMessageSender>(); services.AddTransient<ISmsSender, AuthMessageSender>(); } ``` AdminController.cs ``` [Authorize(Policy = "RequireAdminRole")] public class AdminController : Controller { private readonly PartsDbContext _context; public AdminController(PartsDbContext context) { _context = context; } public IActionResult Index() { return View(); } public IActionResult Towers() { var model = _context.Towers.ToList(); return View(model); } } ``` The line `var model = _context.Towers.ToList();` is where the error is showing up. Once again. I want to setup my PartsDbContext to work with Entity Framework Core in a way that EF-Core will automatically create the database.

Original source