I had a .NET core 1.0 webapp working fine. I had to upgrade to .NET Core 2.0. I also had to add a migration step for my SQLite database.
If I launch this command:
Add-Migration MyMigrationStepName
I get this error:
Unable to create an object of type 'ServicesDbContext'. Add an implementation of 'IDesignTimeDbContextFactory' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.
I've seen plenty of answers on SO and on other blogs and website but none of them actually say where to implement such interface and what code the concrete method should contain!
Creating a Migration The following command creates a migration: [Command Line] dotnet ef migrations add <name of migration> [Package Manager console]
IDesignTimeDbContextFactory<TContext> Interface Implement this interface to enable design-time services for context types that do not have a public default constructor. At design-time, derived DbContext instances can be created in order to enable specific design-time experiences such as Migrations.
Sample:
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
}
public class ApplicationContextDbFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
ApplicationDbContext IDesignTimeDbContextFactory<ApplicationDbContext>.CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer<ApplicationDbContext>("Server = (localdb)\\mssqllocaldb; Database = MyDatabaseName; Trusted_Connection = True; MultipleActiveResultSets = true");
return new ApplicationDbContext(optionsBuilder.Options);
}
}
Location:
Put that class where the ApplicationDbContext is put. It will then be automatically picked up when you use dotnet ef cli commands.
A possible solution to IDesignTimeDbContextFactory<> problem is the DBContext discovery/launch during the add-migration process. Add migrations needs to get a context. If it cant, this error is thrown. This can happen if you do not have a public parameter-less DBContext. So a solution is to Add a public Parameter-less constructor to your context.
public class SomeDbContext: DbContext
{
// this PUBLIC constructor is required for Migration tool
public SomeDbContext()
{
}
// the model...
public DbSet<PocoBla> PocoBlas { get; set; }
....
}
You can have a special version of your DBContext in a separate project .netCore console project for migration code generation purposes.
I solve the problem by simply updating Program.cs to the latest .NET Core 2.x pattern:
From 1.x:
using System.IO; using Microsoft.AspNetCore.Hosting;
namespace AspNetCoreDotNetCore1App {
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
}
} }
To 2.x:
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace AspNetCoreDotNetCore2App
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
Source: https://learn.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With