Add an implementation of 'IDesignTimeDbContextFactory<ServicesDbContext>' to the project error while creating a migration step in .NET core 2.0

柔情痞子 提交于 2019-11-30 17:17:37

问题


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!


回答1:


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.




回答2:


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.




回答3:


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://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation



来源:https://stackoverflow.com/questions/48805886/add-an-implementation-of-idesigntimedbcontextfactoryservicesdbcontext-to-the

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!