1.- First of all you shouldn't create a context inside the controller, avoid use 'new' with dependencies because that would make your code untestable, in my case as I use UnitOfWork I inject it as IUnitOfWork instance that is, indeed, an extension of MyConext, and you'd inject it within the StartUp class... To do so I have a private method (to perform this in a single private call) that looks like:
private void AddEntityFrameworkAndDbContext(IServiceCollection services)
{
services.AddEntityFrameworkSqlServer();
var migrationsAssemblyName = typeof(MyContext).GetTypeInfo().Assembly.GetName().Name;
services.AddDbContext<MyContext>(options =>
{
options.UseSqlServer(
"MY CONNECTION STRING GOES HERE (BUT I RETREIVE IT FROM ANOTHER SERVICE)",
sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.MigrationsAssembly(migrationsAssemblyName);
sqlOptions.EnableRetryOnFailure(maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
});
},
ServiceLifetime.Scoped // Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request)
).AddUnitOfWork<MyContext>(); // This is because I'm also using EF Core Unit of work NuGet Package
}
I'm calling that private method from ConfigureServices(IServiceCollection services), as I said, in StartUp class
// Add EF, and UoW
AddEntityFrameworkAndDbContext(services);
2.- Secondly (but I'd say that this is your real problem) I'd say that you missed base.OnConfiguring(options); in your context, it should be like:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(@"Server=(local);Database=VotingAppDB;User ID=sa;Password=123;");
}
base.OnConfiguring(optionsBuilder);
}
Also, please, take a look at this answer I wrote few weeks ago:
How to setup EF6 Migrations with ASP.NET Core
In addition, that UnitOfWork project deserves a reading, take a look at it here: https://github.com/arch/UnitOfWork
I hope it helps,
Juan